lee290字符串匹配

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, 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
示例 4:
输入: pattern = “abba”, str = “dog dog dog dog”
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

思路 HashMap()

这道题说的是对应关系,那首先想到的集合就是Map,将key(a)-value(dog)存在一起,每当遇到一个字母就去查看对应的单词。 失败有两种情况:
1.key存在,经过查找字母对应的单词和这个单词不匹配;
2.key不存在,但是这个单词已经被存了;

class Solution {
    public boolean wordPattern(String pattern, String str) {
        String[] string =str.split(" ");
        if(pattern.length()!=string.length)
            return false;
        HashMap<Character,String> map=new HashMap<>();
        for(int i=0;i<pattern.length();i++){
            char tmp=pattern.charAt(i);
            if(map.containsKey(tmp)){
                if(!map.get(tmp).equals(string[i])) 
                   return false;
            }
            else {
                if(map.containsValue(string[i])) 
                    return false;
                else  
                    map.put( tmp, string[i] );
            }
        }
        return true;
    }
}

注意:

  1. 必须用equals判断,== 判断的是地址
    if(!map.get(tmp).equals(string[i]))
  2. 先想不匹配的情况、匹配的情况列好了然后再列

indexOf()

针对Pattern字符串,我们可以用indexOf来判断每个字符的位置。
针对Str字符串,可以用split函数分割为字符串数组,然后再自定义一个字符串数组的indexOf函数(Apache.Common.Lang里面倒是有,但是用不了)。
依次循环判断每个Pattern中每个字符的indexOf,以及Str数组中每个字符串的indexOf,如果值都相等,则为true,否则为false。
字符串中,同一个位置的字符在本串中第一次出现的位置相同。我简单解释一下,本题判定为false有这些个情况,我们假设拿s串和t串作对比
1.s串中相同的字符,对应的t串中的字符并不相等
2.s串中不同的字符,对应的t串中的字符却是相等的
所以判断的关键点就是相同的字符要对应相同的字符,那么相同字符处于后位置的字符的第一次出现的位置就应该相同。
所以我们在判断时,只需要判断两个字符串同位置的字符是否相同即可。

 public boolean wordPattern(String pattern, String str) {
        String[] arr = str.split(" ");
        if (pattern.length() != arr.length) return false;
        int len = pattern.length();
        for (int i = 0; i < len; i++) {
            if(pattern.indexOf(pattern.charAt(i)) != indexOf(arr, arr[i])){
                return false;
            }
        }
        return true;        
    };
    
    public static int indexOf(String[] arrays, String searchString) {
        int ans = -1;
        for(int i = 0; i < arrays.length; i++) {
            if (arrays[i].equals(searchString)) {
                ans = i;
                break;
            };
        };
        return ans;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值