> 文档中心 > 力扣刷刷题之单词规律

力扣刷刷题之单词规律


力扣刷刷题之单词规律

题目描述:给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, 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

思路:本题需要判断字符和字符串之间一一对应的关系,一个字符只能对应一个字符串,一个字符串只能由一个字符串来对应。这是集合论中的双射。例如a只能对应dog,而dog只能由a这个字符来对应,不能由其它字符对应。由于pattern只包含小写字母,所以可以创建一个26长度的数组来存放每一个字符对应的单词。将字符串装换成数组,遍历pattern这个字符串,查询每一个字符对应的单词。如果字符对应的单词为空,就遍历26的数组,查询有没有其它字符映射这个单词,如果有映射false,没有就把这个映射添加到26数组中,如果字符对应的单词不为空,就直接判断字符对应的单词和当前单词是否相同,不相同就返回false。

public static boolean wordPattern(String pattern, String s) { String[] a1 = new String[26]; String[] a2 = s.split(" "); // 长度不相等就一定不匹配 if (pattern.length()!=a2.length){     return false; } for (int i=0;i<pattern.length();i++){     char c = pattern.charAt(i);     // 对应字母没有存在映射     if (a1[c-'a']==null){  // 查看其它字母有没有映射这个字符串  for(int j=0;j<26;j++){      // 如果存在映射就返回false      if (a1[j]!=null && a1[j].equals(a2[i])){   return false;      }  }  // 其它字母也没有映射就把字符串添加到对应的字符数组中  a1[c-'a'] = a2[i];     }else{ // 对应字母存在映射,判断映射的字符串是否相等  if(!a1[c-'a'].equals(a2[i])){      return false;  }     } } return true;}}

力扣刷刷题之单词规律