[leetcode[ 【字符串】 44. Wildcard Matching
2016-06-14 23:59
423 查看
Implement wildcard pattern matching with support for
?可以替换任意单字符
*可以匹配任意字符序列,包括空序列
通配符正好可以匹配输入字符串
所以根据*p分三种情况: *p是?时 s和p都接着往下遍历
*p是*时,做一个标记,表示*p前有*; 同时记录*的位置和当前s的位置
*p是其他字符时,如果前边没有*并且当前字符不匹配,则返回错误 ; 如果前边有*,p要筛选s(筛选的过程是这样,*后面的字符与s的进行逐一匹配,如果匹配失败,则过滤掉一个s)
class Solution {
public:
bool isMatch(string s, string p) {
bool start=false;
const char *scur,*pcur,*ss,*pp;
for(scur=&s[0],pcur=&p[0];*scur!='\0';scur++,pcur++)
{
switch(*pcur)
{
case '?':
break;
case '*':
start=true;
ss=scur;
pp=pcur;
while(*pp=='*') pp++;//连续的*是一样的效果
if(*pp=='\0') return true;
scur=ss-1;//相当于下一轮s的位置不变
pcur=pp-1;//把下一轮的p置于*的后面
break;
default :
if(*pcur!=*scur)
{
if(!start) return false;
ss++;
scur=ss-1;//s往前遍历,p保持在*后面
pcur=pp-1;
}
break;
}
}
while(*pcur=='*') pcur++;
return *pcur=='\0';
}
};
'?'and
'*'.
'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial). The function prototype should be: bool isMatch(const char *s, const char *p) Some examples: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false
题意
实现?和*的通配符模式匹配?可以替换任意单字符
*可以匹配任意字符序列,包括空序列
通配符正好可以匹配输入字符串
题解
难度在于*可以匹配一段字符串,所以如果p中包含有*,则做一个标记,把s中与p的*后面的字符不匹配的过滤掉所以根据*p分三种情况: *p是?时 s和p都接着往下遍历
*p是*时,做一个标记,表示*p前有*; 同时记录*的位置和当前s的位置
*p是其他字符时,如果前边没有*并且当前字符不匹配,则返回错误 ; 如果前边有*,p要筛选s(筛选的过程是这样,*后面的字符与s的进行逐一匹配,如果匹配失败,则过滤掉一个s)
class Solution {
public:
bool isMatch(string s, string p) {
bool start=false;
const char *scur,*pcur,*ss,*pp;
for(scur=&s[0],pcur=&p[0];*scur!='\0';scur++,pcur++)
{
switch(*pcur)
{
case '?':
break;
case '*':
start=true;
ss=scur;
pp=pcur;
while(*pp=='*') pp++;//连续的*是一样的效果
if(*pp=='\0') return true;
scur=ss-1;//相当于下一轮s的位置不变
pcur=pp-1;//把下一轮的p置于*的后面
break;
default :
if(*pcur!=*scur)
{
if(!start) return false;
ss++;
scur=ss-1;//s往前遍历,p保持在*后面
pcur=pp-1;
}
break;
}
}
while(*pcur=='*') pcur++;
return *pcur=='\0';
}
};
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- C++中const用法总结
- CPP 虚函数、虚函数表及虚拟继承(转)
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- Deploying Control Plane Policing
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解