290. Word Pattern【LeetCode by java】

青春壹個敷衍的年華 提交于 2021-02-06 07:46:43

今天发现LintCode页面刷新不出来了,所以就转战LeetCode。还是像以前一样,做题顺序:难度从低到高,每天至少一题。

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.

Example 1:

Input: pattern = "abba", str = "dog cat cat dog"
Output: true

Example 2:

Input:pattern = "abba", str = "dog cat cat fish"
Output: false

Example 3:

Input: pattern = "aaaa", str = "dog cat cat dog"
Output: false

Example 4:

Input: pattern = "abba", str = "dog dog dog dog"
Output: false

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

解题:题目给定俩字符串,第一个字符串是由若干非空字符组成,第二个字符串由若干单词组成,用空白字符隔开。要求判断两组字符串格式是否相同。先贴一下自己写的代码吧,写的代码比较多,也没啥技术含量。最主要的思想是,遍历第一个字符串,比较各个位置上的字符是否相同,同时比较另一个字符串相同位置的单词是否相等,如果有不匹配的,返回false,遍历结束时,返回true。代码如下:

 1 class Solution {
 2     public boolean wordPattern(String pattern, String str) {
 3         
 4         if(pattern == null && str == null)
 5             return true;
 6         String []temp = str.split(" ");
 7         
 8         if(pattern.length() != temp.length)
 9             return false;
10         if(pattern.length() ==1)
11             return true;
12         for(int i = 1; i < pattern.length(); i++){
13             for(int j = 0; j < i; j++){
14                 if(pattern.charAt(i) == pattern.charAt(j)){
15                     if(!equal(temp, i, j)){
16                         return false;
17                     }
18                 }
19                 if(pattern.charAt(i) != pattern.charAt(j)){
20                     if(equal(temp, i, j)){
21                         return false;
22                     }
23                 }
24             }
25         }
26         return true;
27         
28     }
29     public boolean equal(String[]temp,int index1,int index2){
30         if(temp[index1].equals(temp[index2])){
31             return true;
32         }else{
33             return false;
34         }
35     }
36 
37     }
38 }

       在discussion上看到了更好的方法,用hash表来做的。hashmap中插入一组数据的方法是:public V put (K key, V value )  如果插入一组数据时,已经有key存在,则返回 旧的value,并用新的value来覆盖旧的value。

       那么用一个循环同时遍历两个String,如果相同位置有重复的,说明两个字符串匹配,反之,如果哪个位置上,一个字符串发现已经有这个key值了,另一个string却发现hashmap里并没有重复出现的key值,说明两个字符串的格式并不匹配。代码如下:

class Solution {
    public boolean wordPattern(String pattern, String str) {
        
        String[]words = str.split(" ");
        if(pattern.length() != words.length)
            return false;
        
        Map map1=new HashMap();
        Map map2=new HashMap();
        for(int i = 0; i < pattern.length(); i++){
            if((map1.put(pattern.charAt(i), i)) != map2.put(words[i], i))
                return false;
        }
        return true;
        
    }
}

由于此题把第二个字符串转化为了字符数组,那么遍历时及时字符和字符串内容相同,其类型也不相同,所以可以只用一个map。代码进一步化简为:

 1 class Solution {
 2     public boolean wordPattern(String pattern, String str) {        
 3          String[] words = str.split(" ");
 4          if (words.length != pattern.length())
 5              return false;
 6          Map index = new HashMap();
 7          for (Integer i = 0; i < words.length; ++i)
 8               if (index.put(pattern.charAt(i), i) != index.put(words[i], i))
 9                   return false;
10          return true;
11     }
12 }

 

 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!