請實現乙個函式用來匹配包含』. 『和』『的正規表示式。模式中的字元』.『表示任意乙個字元,而』'表示它前面的字元可以出現任意次(含0次)。匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但與"aa.a"和"ab*a"均不匹配。
設正規表示式為p,主串為s,s前面i-1個字元和p前面j-1個字元已經匹配
1.遞迴法
1)若p[j]不為』∗』,p[j+1]不為』∗』 ,則比較s[i]與p[j],若s[i]==p[j]或者p[j]為』.』,將主串和模式串均像後移動一位(i+=1,j+=1),繼續比較,不相等則返回false
2)若p[j]不為』∗』,p[j+1]為』∗』,則分兩種情況
1.p[j]出現一次,若s[i]==p[j],則將主串往後移動一位(i+=1),模式串不移動,繼續比較,若不等則表示不匹配
2.p[j]不出現,將模式串後移兩位(j+=2),繼續比較
bool
mach
(string s,string p,
int i,
int j)
//表示s[0..i-1]與p[0..j-1]已經匹配
return1;
}else
else
}return0;
}
2.動態規劃
設f[i][j]表示模式串s的前i個字元和正則串的前j個字元能否匹配
1.情況一:若p[j]為普通字元,則看s[i]==p[j],若相等則看s[0…i-1]與p[0…j-1],不等則表示不匹配
情況二:若p[j]為』.』,則看s[0…i-1]與p[0…j-1]能否匹配
兩種情況可合為一種
f[i][j]=f[i-1][j-1]
2.若p[j]為』*』,則分為匹配一次和匹配0次
匹配一次:若p[j-1]能和s[i-1]匹配,(即p[j-1]=s[i-1]或者p[j- 1]=』.』),則能否匹配取決於s[0…i-1]和p[0…j]是否匹配
f[i][j]=f[i-1][j]
匹配0次:能否匹配取決於s[0…i]和p[j-2]能否匹配
f[i][j]=f[i][j-2]
bool
ismatch
(string s, string p)
else
//匹配一次
if(i>=
1&&j>=2&&
(p[j-2]
=='.'
||s[i-1]
==p[j-2]
))f[i]
[j]=
(f[i]
[j]||f[i-1]
[j]);}
}}}return f[m]
[n];
}
正規表示式 匹配
字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...
正規表示式匹配
請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...
正規表示式匹配
請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...