【題目】 給定字串str,其中絕對不含有字元』.『和』』。再給定字串exp, 其中可以含有』.『或』』,』'字元不能是exp的首字元,並且任意兩個 '『字元不相鄰。exp中的』.『代表任何乙個字元,exp中的』『表示』』 的前乙個字元可以有0個或者多個。請寫乙個函式,判斷str是否能被 exp匹配。
【舉例】 str=「abc」,exp=「abc」,返回true。 str=「abc」,exp=「a.c」,exp中單個』.『可以代表任意字元,所以返回 true。 str=「abcd」,exp="."。exp中』『的前乙個字元是』.』,所以可表示任 意數量的』.『字元,當exp是"…「時與"abcd"匹配,返回true。 str=」",exp="…"。exp中』『的前乙個字元是』.』,可表示任意數量 的』.'字元,但是"."之前還有乙個』.『字元,該字元不受』'的影響, 所以str起碼有乙個字元才能被exp匹配。所以返回false
遞迴方法
public
static
boolean
process
(char
s,char
e,int si,
int ei)
if(ei +
1== e.length || e[ei +1]
!='*'
)while
(si != s.length &&
(e[ei]
== s[si]
|| e[ei]
=='.'))
si++;}
return
process
(s, e, si, ei +2)
;}
動態規劃
//驗證給定字串是否符合str exp規範
public
static
boolean
isvalid
(char
s,char
e)}for
(int i =
0; i < e.length; i++)}
return
true;}
public
static
boolean
ismatch
(string str, string exp)
char
s = str.
tochararray()
;char
e = exp.
tochararray()
;return
isvalid
(s, e)
?process
(s, e,0,
0):false;}
//開始
public
static
boolean
ismatchdp
(string str, string exp)
char
s = str.
tochararray()
;char
e = exp.
tochararray()
;if(!
isvalid
(s, e)
)boolean
dp =
initdpmap
(s, e)
;for
(int i = s.length -
1; i >-1
; i--
)else
si++;}
if(dp[i]
[j]!=
true)}
}}return dp[0]
[0];
}//初始化basecase:最後兩列和最後一行
public
static
boolean
initdpmap
(char
s,char
e)else}if
(slen >
0&& elen >0)
}return dp;
}public
static
void
main
(string[
] args)
通用字串匹配,動態規劃
題目如下 給定乙個字串 s 和乙個字元模式 p 實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個字串 s 而不是部分字串。說明 示例 1 輸入 s aa p a 輸出 false 解釋 a 無法匹配 aa 整個字串。示例 2 輸入 s aa p a 輸出 ...
遞迴和動態規劃 字串的子串行
列印乙個字串的全部子串行,包括空字串 在字串的子串行中,每個字元都包含兩種情況,1.該字元在序列中 2.該字元不在序列中 解 遞迴 base case 當前位置指向字串的最後乙個字元時,返回 所以在遞迴的過程中分為兩種情況 1.該字元在序列中 2.該字元不在序列中 public class prin...
動態規劃 字串交叉問題
給出三個佇列 s1,s2,s3 判斷 s3 是否是由 s1 和 s2 交叉得來。如 s1 為 aabcc s2 為 dbbca。當 s3 為 aadbbcbcac 時,返回 true 即將 s1 拆成三部分 aa,bc,c 分別插入 s2 對應位置 否則返回 false。aabcc,dbbca,aa...