//有一個字符串它的構成是詞+空格的組合,如“北京 杭州 杭州 北京”,
//要求輸入一個匹配模式(簡單的以字符來寫), 比如 aabb, 來判斷該字符串是否符合該模式, 舉個例子:
//1. pattern = “abba”, str=“北京 杭州 杭州 北京” 返回 ture
//2. pattern = “aabb”, str=“北京 杭州 杭州 北京” 返回 false
//3. pattern = “baab”, str=“北京 杭州 杭州 北京” 返回 ture
這道題還是比較簡單的,pattern並不是正則表達式,str也不是說根據pattern的某種規律來推算,就是實打實的匹配。
思路:
- 首先要將pattern和str進行對應,不同的字母對應不同的詞
- 其次,字母的出現的順序應該和詞出現的順序一致
- 如果上述條件,任何一個不滿足就匹配不成功
- 可以用map將對應關係進行保存下來,key=字母,val=詞,挨個遍歷pattern對應位置上的值,如果在map中存在,則比較val是否相等;如果不存在則將對應關係放入map中
- 但是有個漏洞:如果此時map中不存在,但是val中存在會返回true,這時需要在val中判斷,之前是否有這個val,如果有則字母與詞不匹配。
代碼如下:
public static boolean wordPattern(String pattern, String str) {
Map<Character, String> map = new HashMap<>();
char[] ptArr = pattern.toCharArray();
String[] strArr = str.split(" ");
if (ptArr.length != strArr.length) {
return false;
}
for (int i = 0; i < ptArr.length; i++) {
String val = map.get(ptArr[i]);
if (null != val) {
return val.equals(strArr[i]);
} else {
if (!map.values().contains(strArr[i])) {
map.put(ptArr[i], strArr[i]);
} else {
return false;
}
}
}
return true;
}
上面的代碼還可以做個小小的優化,針對pattern和str可以判斷下長度,如果長度都爲1,直接返回true。
如果有更好的實現方式歡迎留言