fish-stack / Algo

算法相关的话题
0 stars 0 forks source link

290. 单词规律 #29

Open bitfishxyz opened 5 years ago

bitfishxyz commented 5 years ago

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false

说明: 你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。    

bitfishxyz commented 5 years ago

解析

首先pattern数组和str数组长度一定要是相同的。

然后我们可以循环一遍,循环的时候记录pattern和str的映射关系。

bitfishxyz commented 5 years ago

Java

import java.util.*;

class Solution {
    public boolean wordPattern(String pattern, String str) {
        // 转化为数组,方便计算
        char[] patterns = pattern.toCharArray();
        String[] strings = str.split(" ");

        // 首先长度肯定是要相等的
        if (patterns.length != strings.length) {
            return false;
        }

        // 记录pattern和str的对应关系
        Map<Character, String> relation = new HashMap<>();

        // 循环一遍,判断是否满足规则
        for (int i = 0; i < patterns.length; i++) {

            char currentPattern = patterns[i];
            String currentString = strings[i];

            // 说明当前的pattern没有被用过
            if (relation.get(currentPattern) == null) {

                // 说明当前字符串被用过了,无法建立对应关系,直接返回false
                if (relation.values().contains(currentString)){
                    return false;
                } else {
                    // 说明这里没问题,我们可以记录下二者的对应关系
                    relation.put(currentPattern, currentString);
                }

            // 说明这个pattern已经被建立对应关系了
            } else {
                // 这时我们就要判断当前对应关系是否成立了
                if (!relation.get(currentPattern).equals(currentString)){
                    return false;
                }
            }
        }

        // 如果上面没有问题,就返回true
        return true;
    }
}