[290] 单词规律

/*
 * @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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值