阿里巴巴笔试题:匹配模式(简单的以字符来写), 比如 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 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。

如果有更好的实现方式欢迎留言

你可能感兴趣的:(面试)