阿里巴巴筆試題:匹配模式(簡單的以字符來寫), 比如 aabb, 來判斷該字符串是否符合該模式

//有一個字符串它的構成是詞+空格的組合,如“北京 杭州 杭州 北京”,
//要求輸入一個匹配模式(簡單的以字符來寫), 比如 aabb, 來判斷該字符串是否符合該模式, 舉個例子:
//1. pattern = “abba”, str=“北京 杭州 杭州 北京” 返回 ture
//2. pattern = “aabb”, str=“北京 杭州 杭州 北京” 返回 false
//3. pattern = “baab”, str=“北京 杭州 杭州 北京” 返回 ture

這道題還是比較簡單的,pattern並不是正則表達式,str也不是說根據pattern的某種規律來推算,就是實打實的匹配。

思路:

  1. 首先要將pattern和str進行對應,不同的字母對應不同的詞
  2. 其次,字母的出現的順序應該和詞出現的順序一致
  3. 如果上述條件,任何一個不滿足就匹配不成功
  4. 可以用map將對應關係進行保存下來,key=字母,val=詞,挨個遍歷pattern對應位置上的值,如果在map中存在,則比較val是否相等;如果不存在則將對應關係放入map中
  5. 但是有個漏洞:如果此時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。

如果有更好的實現方式歡迎留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章