290. 单词规律

题目:

思路:

【1】这道题本质上和 205. 同构字符串 这题十分相似

区别在于一个是字符与字符互相映射,另一个是字符与字符串互相映射
而且思路都是可以借鉴的

 

代码展示:

//时间1 ms 击败 56.94%
//内存39.3 MB 击败 82.10%
//时间复杂度:O(n+m),其中 n 为 pattern 的长度,m 为 str 的长度。
//插入和查询哈希表的均摊时间复杂度均为 O(n+m)。每一个字符至多只被遍历一次。
//空间复杂度:O(n+m),其中 n 为 pattern 的长度,m 为 str 的长度。
//最坏情况下,我们需要存储 pattern 中的每一个字符和 str 中的每一个字符串。
class Solution {
    public boolean wordPattern(String pattern, String s) {
        char[] sc = pattern.toCharArray();
        String[] tc = s.split(" ");
        if (sc.length != tc.length) return false;
        Map<Character, String> s2t = new HashMap<>();
        Map<String, Character> t2s = new HashMap<>();
        int len = sc.length;
        for (int i = 0; i < len; ++i) {
            char x = sc[i];
            String y = tc[i];
            if ((s2t.containsKey(x) && !s2t.get(x).equals(y)) || (t2s.containsKey(y) && t2s.get(y) != x)) {
                return false;
            }
            s2t.put(x, y);
            t2s.put(y, x);
        }
        return true;
    }
}

//时间0 ms 击败 100%
//内存39.3 MB 击败 83.83%
class Solution {
    public boolean wordPattern(String pattern, String s) {
        char[] sc = pattern.toCharArray();
        String[] tc = s.split(" ");
        if (sc.length != tc.length) return false;
        // 由于出现的字符都由 ASCII 字符组成,所以固定最多出现256个字符
        int[] si = new int[256];
        Map<String, Integer> ti = new HashMap<>();
        for(int i = 0; i < sc.length; i++) {
            // 如果两个字符的下标不对应则说明出现了不同的映射
            // 如果是0则说明还没生成映射关系
            if (si[sc[i]] != ti.getOrDefault(tc[i],0)) {
                return false;
            }
            //这里进行+1是用于表示位置,因为int数组默认初始化是0,所以不能用0进行比对
            si[sc[i]] = i + 1;
            ti.put(tc[i], i + 1);
        }

        return true;
    }
}

 

posted @ 2023-06-28 18:07  忧愁的chafry  阅读(8)  评论(0编辑  收藏  举报