LeetCode第44题:通配符匹配(困难)
- 题目:给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。’?’ 可以匹配任何单个字符。’’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。
- 解法一:想根据p的字符分成’’、’?‘和字母三类,然后进行判断。但是’'的情况有些复杂,尝试很多次后,通过率最高的解法如下:
class Solution {
public boolean isMatch(String s, String p) {
int len1=s.length();
int len2=p.length();
int i,j;
if(len1==0 || len2==0 || len2>len1) return false;
for(i=0,j=0;i<len1 && j<len2;){
if(p.charAt(j)=='?'){
i++;
j++;
}else if(p.charAt(j)=='*'){
if(j==len2-1) return true;
j++;
while(i<len1 && p.charAt(j) != s.charAt(i)){
i++;
}
if((i==len1-1 && j!=len2-1) || (i !=len1-1 && j==len2-1)) return false;
i++;
j++;
}else{
if(p.charAt(j) == s.charAt(i)){
i++;
j++;
}else{
if(j>1 && p.charAt(j-2)=='*'){
j--;
while(i<len1 && p.charAt(j) != s.charAt(i)){
i++;
}
if((i==len1-1 && j!=len2-1) || (i !=len1-1 && j==len2-1)) return false;
i++;
j++;
}else{
return false;
}
}
}
}
if(i==len1 && j==len2) return true;
return false;
}
}
- 解法二:题解里的一种神仙算法,应该也是采用了回溯思想吧,不匹配的时候通过start判断前面是否有’*’,好腻害呀
class Solution {
public boolean isMatch(String s, String p) {
int sn = s.length();
int pn = p.length();
int i = 0;
int j = 0;
int start = -1;
int match = 0;
while (i < sn)
{
if (j < pn && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?'))
{
i++;
j++;
}
else if (j < pn && p.charAt(j) == '*')
{
start = j;
match = i;
j++;
}
else if (start != -1)
{
j = start + 1;
i = ++match;
}
else
{
return false;
}
}
while (j < pn)
{
if (p.charAt(j) != '*')
return false;
j++;
}
return true;
}
}