乐趣区

关于jav:LeetCode290单词规律

单词法则

题目形容:给定一种法则 pattern 和一个字符串 str,判断 str 是否遵循雷同的法则。

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

示例阐明请见 LeetCode 官网。

起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。

解法一:字符匹配
  • 首先,失去字符串 s 的所有单词放到一个 List 外面 strList(须要向空字符串排除掉);
  • 而后,判断 strList 的数量和 pattern 的长度是否雷同,如果不雷同,阐明无奈遵循法则,间接返回 false。
  • 而后,申明一个 Map 即 mappings 用来存 pattern 中的字符和 strList 中单词的映射关系,遍历 pattern 的字符,具体过程如下:

    • 如果以后字符在 mappings 的 key 外面且 strList 以后的单词和以后字符在 mapping 中映射的单词不雷同,则返回 false;
    • 如果以后字符不在 mappings,如果 strList 以后的单词在 mappings 的 values 集外面,则返回 false;如果 strList 以后的单词不在 mappings 的 values 集外面,则将以后字符和 strList 以后的单词放入 mappings 中,而后持续判断下一个字符。
  • 最初,如果没有发现不匹配的映射关系,则返回 true。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LeetCode_290 {public static boolean wordPattern(String pattern, String s) {String[] strs = s.split(" ");
        List<String> strList = new ArrayList<>();
        for (String str : strs) {if (str != "") {strList.add(str);
            }
        }
        // 判断 strList 的数量和 pattern 的长度是否雷同,如果不雷同,阐明无奈遵循法则,间接返回 false
        if (pattern.length() != strList.size()) {return false;}
        Map<Character, String> mappings = new HashMap<>();
        for (int i = 0; i < strList.size(); i++) {if (mappings.keySet().contains(pattern.charAt(i))) {if (!strList.get(i).equals(mappings.get(pattern.charAt(i)))) {return false;}
            } else {if (mappings.values().contains(strList.get(i))) {return false;}
                mappings.put(pattern.charAt(i), strList.get(i));
            }
        }
        return true;
    }

    public static void main(String[] args) {System.out.println(wordPattern("abba", "dog dog dog dog"));
    }
}

【每日寄语】 只有有心,生存是会开花的。

退出移动版