LeetCode 290. Word Pattern 单词匹配

Question:

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str.

Examples:

  1. pattern = "abba", str = "dog cat cat dog" should return true.
  2. pattern = "abba", str = "dog cat cat fish" should return false.
  3. pattern = "aaaa", str = "dog cat cat dog" should return false.
  4. pattern = "abba", str = "dog dog dog dog" should return false.

Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

问题:

已知字符串pattern与字符串str,确认str是否与pattern匹配。str与pattern匹配代表字符串str中的单词与pattern中的字符一一对应。str中单词使用空格分隔。

如:

  1. pattern = "abba", str = "dog cat cat dog" 匹配
  2. pattern = "abba", str = "dog cat cat fish" 不匹配
  3. pattern = "aaaa", str = "dog cat cat dog" 不匹配
  4. pattern = "abba", str = "dog dog dog dog" 不匹配

思路:

创建一个 Map<String, Character> map = new HashMap<String, Character>(),建立单词到pattern字符的映射。另外采用一个boolean[] used_char数组,标识Pattern中字符是否已经被使用。

1. 若pattern长度与str中单词个数不同,直接返回不匹配。

2. 若str中当前单词未在Map中出现过,那么判断当前pattern字符是否被使用,因为要求单词与字符一一对应。若已被使用,那么匹配不成功。若未被使用,添加一个<string,char>对到map中。

3. 若str中当前单词已经Map中,则当前单词已经存在键值对,那么判断当前pattern字符是否与Map中与此单词对于的字符相同。不同的话,返回不匹配。

class Solution {
    public boolean wordPattern(String pattern, String str) {
        Map<String, Character> map = new HashMap<String, Character>(); //建立单词->字符 str->pattern的map
        boolean[] used_char = new boolean[128]; //存储当前pattern的字符有没有被使用
        int pos = 0;
        for(int i=0; i<pattern.length(); i++)
        {
            used_char[pattern.charAt(i)] = false; //pattern的字符初始全设为没使用过
        }
        String[] s = str.split(" ");
        if(s.length != pattern.length()) //str单词数不等于pattern长度,返回匹配失败
            return false;
        for(int i=0; i<s.length;i++)
        {
            if(map.containsKey(s[i]) != true)//如果单词未出现在map中
            {
                if(used_char[pattern.charAt(pos)] == true) //但是当前pattern字符已经被配对过
                    return false;
                else
                {
                     map.put(s[i],pattern.charAt(pos));//插入单词与pattern的配对关系
                     used_char[pattern.charAt(pos)] = true;
                }
                
            }
            else
            {
                if(map.get(s[i]) != pattern.charAt(pos)) //如果单词已经出现在了map中,但是map中单词匹配的char与pattern当前字符不同
                    return false;
            }
            pos++;  
        }

        return true;
    }
}
博主学习笔记,转载请注明出处,谢谢~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值