好困啊,终于做出来了。
题目如下:
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:
pattern = “abba”, str = “dog cat cat dog” should return true.
pattern = “abba”, str = “dog cat cat fish” should return false.
pattern = “aaaa”, str = “dog cat cat dog” should return false.
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.
这里的模式判别就是符号和单词的映射。所以直接想到了使用map这种容器进行承装记录映射。
字符串转化成字符串数组,或者字符数组,这些基本功前面也遇到过。
这里需要注意的就是word和pattern存在一种双向的映射,即两个方向都要求是单射。所以最后建立两个Map才满足双向查询。
附上代码
import java.util.HashMap;
import java.util.Map;
public class Solution {
public boolean wordPattern(String pattern, String str) {
//build a pattern container
//if is empty then construct a new word to save it
//find if the word exist in the container,then
String[] words=str.split(" ");
String[] patternArray=pattern.split("");
for(String temp:words){
// System.out.println("words:");
// System.out.println(temp);
}
for(String temp:patternArray){
// System.out.println("patternArray");
// System.out.println(temp);
}
/// System.out.println("patternArray:"+patternArray);
int length=words.length;
if(length!=pattern.length()){
return false;
}
// System.out.format("word length %d,pattern length %d \n",words.length,pattern.length());
Map<String,String> map=new HashMap<String ,String>();
Map<String,String> demap=new HashMap<String ,String>();
for(int i=0;i<length;i++){//start number wrong once
if(map.get(patternArray[i])==null&&demap.get(words[i])==null){
//map.put(key, value)
map.put(patternArray[i],words[i]);
demap.put(words[i],patternArray[i]);
// System.out.format("This is null,and put a %s \n",words[i]);
}
else if ( ( (map.get(patternArray[i])!=null) && !map.get(patternArray[i]).equals(words[i]) )
||( (demap.get(words[i])!=null)&& !demap.get(words[i]).equals(patternArray[i]) ) ){
// System.out.format("Getting: %s 's value,is %s ,but not equals %s",patternArray[i],map.get(patternArray[i]),words[i]);
return false;
}//logec wrong once
}
return true ;
//how about using a uniq container to test and catch excptions ?
}
}
总结
- 巧妙地使用java容器可以节约很多的代码,要多多熟悉java的库内容。
- 不得不承认测试是一个软件健壮与否的重要判定。