/*
* @lc app=leetcode.cn id=290 lang=java
*
* [290] 单词规律
*/
// @lc code=start
class Solution {
// 基本法
// public boolean wordPattern(String pattern, String s) {
// HashMap<Character, String> p2sMap = new HashMap<>();
// HashMap<String, Character> s2pMap = new HashMap<>();
// String[] sArr = s.split(" ");
// if(sArr.length != pattern.length()){
// return false;
// }
// for(int i = 0; i < pattern.length(); i++){
// Character p = pattern.charAt(i);
// String str = sArr[i];
// if(p2sMap.containsKey(p) && !str.equals(p2sMap.get(p))
// || s2pMap.containsKey(str) && p != s2pMap.get(str)){
// return false;
// }
// p2sMap.put(p, str);
// s2pMap.put(str, p);
// }
// return true;
// }
/**
* 优化版:
* 44/44 cases passed (1 ms)
Your runtime beats 93.3 % of java submissions
Your memory usage beats 97.3 % of java submissions (40.3 MB)
*/
public boolean wordPattern(String pattern, String s) {
HashMap<Character, String> p2sMap = new HashMap<>();
HashMap<String, Character> s2pMap = new HashMap<>();
StringBuilder buff = new StringBuilder(8);
int startIndex = 0;
for(int i = 0; i < pattern.length(); i++){
Character p = pattern.charAt(i);
// 获取 startIndex 处的第一个单词
fillFirstWordToBuff(buff, s, startIndex);
String str = buff.toString();
buff.setLength(0);
// 直接定位到下一个单词的开始位置
startIndex += (str.length() + 1);
// 检查 对应 字符 和 字符串关系是否一致
String tmpStr = p2sMap.get(p);
if(tmpStr != null)
{
if(!str.equals(tmpStr)){
return false;
}
}else{
p2sMap.put(p, str);
}
Character tmpChar = s2pMap.get(str);
if(tmpChar != null){
if(p != tmpChar){
return false;
}
}else{
s2pMap.put(str, p);
}
}
// 如果 没有找到 s 的尾部,说明 不完全匹配
if(startIndex != s.length() + 1){
return false;
}
return true;
}
private void fillFirstWordToBuff(StringBuilder buff, String str, int startIndex) {
for(int i = startIndex; i < str.length(); i++){
char c = str.charAt(i);
if(c == ' '){
break;
}
buff.append(c);
}
}
}
// @lc code=end
[290] 单词规律
于 2024-08-20 19:38:36 首次发布