生活随笔
收集整理的這篇文章主要介紹了
程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 題目
你有兩個(gè)字符串,即pattern和value。
pattern字符串由字母"a"和"b"組成,用于描述字符串中的模式。
例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),該字符串也匹配像"a"、"ab"和"b"這樣的模式。
但需注意"a"和"b"不能同時(shí)表示相同的字符串。
編寫一個(gè)方法判斷value字符串是否匹配pattern字符串。
示例
1:
輸入: pattern
= "abba", value
= "dogcatcatdog"
輸出:
true示例
2:
輸入: pattern
= "abba", value
= "dogcatcatfish"
輸出:
false示例
3:
輸入: pattern
= "aaaa", value
= "dogcatcatdog"
輸出:
false示例
4:
輸入: pattern
= "abba", value
= "dogdogdogdog"
輸出:
true
解釋:
"a"="dogdog",b
="",反之也符合規(guī)則提示:
0 <= len(pattern
) <= 1000
0 <= len(value
) <= 1000
你可以假設(shè)pattern只包含字母
"a"和
"b",value僅包含小寫字母。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 本質(zhì):x*a+y*b=n 的整數(shù)解
- 注意例子"ab", "",結(jié)果false,容易錯(cuò)
class Solution {
public:bool patternMatching(string pattern
, string value
) {if(pattern
==value
)return true;else if(pattern
=="" && value
!="")return false;int i
, a
= 0, b
= 0, vlen
= value
.size();for(i
= 0; i
< pattern
.size(); ++i
){if(pattern
[i
]=='a')a
++;elseb
++;}if(a
==0 || b
==0){if(value
=="")return true;a
= max(a
, b
);return onlyAorB(value
, a
);}if(onlyAorB(value
,a
) && value
.size()!=0)return true;if(onlyAorB(value
,b
) && value
.size()!=0)return true;int la
=1, lb
=1;while(la
*a
< vlen
){if((vlen
-la
*a
)%b
){la
++;continue;}lb
= (vlen
-la
*a
)/b
;if(good(la
,lb
,pattern
,value
))return true;la
++;}return false;}bool onlyAorB(string
& val
, int a
){if(val
.size()%a
)return false;int n
= val
.size()/a
;string sub
= val
.substr(0,n
);for(int j
= n
; j
< val
.size(); j
+=n
){if(val
.substr(j
,n
) != sub
)return false;}return true;}bool good(int la
, int lb
, string
& pat
, string
& val
){int idxa
= -1, idxb
= -1, i
= 0, idx
= 0;while(idxa
==-1 || idxb
==-1){ if(pat
[i
]=='a'){if(idxa
== -1)idxa
= idx
;idx
+= la
;}else{if(idxb
== -1)idxb
= idx
;idx
+= lb
;}i
++;}string sa
= val
.substr(idxa
, la
);string sb
= val
.substr(idxb
, lb
);int j
= 0, delta
;for(i
= 0; i
< pat
.size(); ++i
, j
+=delta
){if(pat
[i
]=='a'){delta
= la
;if(val
.substr(j
,la
) != sa
)return false;}else{delta
= lb
;if(val
.substr(j
,lb
) != sb
)return false;}}return true;}
};
總結(jié)
以上是生活随笔為你收集整理的程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。