字串匹配問題 遞迴和動態規劃

2021-10-10 22:30:02 字數 2133 閱讀 7388

【題目】 給定字串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...