单词法则
题目形容:给定一种法则 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"));
}
}
【每日寄语】 只有有心,生存是会开花的。