//评测题目: 有一个字符串它的构成是词+空格的组合,如“北京+杭州+杭州+北京”,+要求输入一个匹配模式(简单的以字符来写),+比如+aabb,+来判断该字符串是否符合该模式,+举个例子:
//1.pattern="abba",str="北京 杭州 杭州 北京"返回ture
//2.pattern="aabb",str="北京 杭州 杭州 北京"返回false
//3.pattern="baab",str="北京 杭州 杭州 北京"返回ture
下面本人愚见
public class Main {
public static void main(String[] args) {
String pattern = "aabb";
String str = "通过 通过 pass pass";
boolean flag = wordPattern(pattern, str);
System.out.println(flag);
}
public static boolean wordPattern(String pattern,String str){
//空值校验省略
String a = null;
String b = null;
String[] strArr = str.split(" ");
StringBuffer sb = new StringBuffer();
for(String param : strArr) {
if(a == null) {
a = param;
sb = sb.append("a");
}else if(a.equals(param)){
sb = sb.append("a");
}else if(b == null) {
b = param;
sb = sb.append("b");
} else if(b.equals(param)) {
sb = sb.append("b");
}
}
return pattern.equals(sb.toString());
}
}
上面是硬编码,下面使用了集合框架,同时提供了更宽可用性,在复杂度上有所增加。
public static boolean wordPattern(String pattern, String str) {
Map<Character, String> map = new HashMap<Character, String>();
Set<String> set = new HashSet<String>();
String[] pieces = str.split(" ");
if(pieces.length != pattern.length()) return false;
int i = 0;
for(String s : pieces){
char p = pattern.charAt(i);
System.out.println(p);
// 如果该字符产生过映射
if(map.containsKey(p)){
// 且映射的字符串和当前字符串不一样
if(!s.equals(map.get(p))) return false;
} else {
// 如果该字符没有产生过映射
// 如果当前字符串已经被映射过了
if(set.contains(s)) return false;
// 否则新加一组映射
map.put(p, s);
set.add(s);
}
i++;
}
return true;
}