描述:
给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。
实现:
public class Solution {
/**
* @param strs: A list of strings
* @return: A list of strings
*/
public List<String> anagrams(String[] strs) {
List<String> result=new ArrayList<>();
if(strs==null || strs.length==0){
return result;
}
HashMap<String, String> h=new HashMap<>();
for(int i=0; i<strs.length; i++){
String st=mySort(strs[i]);
if(h.get(st)!=null){
result.add(strs[i]);
h.put(st, h.get(st).replace("0", "1"));
}
else{
h.put(st, strs[i]+"0");
}
}
for(String st: h.keySet()){
String t=h.get(st);
if(t.charAt(t.length()-1)=='1'){
result.add(t.substring(0, t.length()-1));
}
}
return result;
}
private String mySort(String str){
if(str==null || str=="") return str;
char[] c=str.toCharArray();
Arrays.sort(c);
StringBuilder sb=new StringBuilder();
for(int i=0; i<c.length; i++){
sb.append(c[i]);
}
return sb.toString();
}
}
个人感觉这个题目,lintcode给出的测试用例有点问题,因为按照题干中给出的乱序字符串的定义(字符集相同但顺序不同),两个相同的字符串不是乱序字符串,比如字符串数组["abc","abc","bcd","dcb"],最后应该只输出["bcd","dcb"],但是lintcode的测试用例里面把"abc"也作为乱序字符串了。上面的代码是能够完成这个功能的,下面在此基础上修改的代码可以消除这个情况:
public class Anagrams {
public List<String> anagrams(String[] strs) {
List<String> result=new ArrayList<>();
if(strs==null || strs.length==0){
return result;
}
boolean flag=false;
Set<String> s=new HashSet<>();//消除相同的字符串
HashMap<String, Integer> hCount=new HashMap<>();//记录相同的字符串出现的次数
for(int i=0; i<strs.length; i++){
if(flag && strs[i].length()==0){
result.add("");
}
if(strs[i].length()==0){
flag=true;
}
if(hCount.get(strs[i])!=null){
hCount.put(strs[i], hCount.get(strs[i])+1);
}
else{
hCount.put(strs[i], 1);
}
s.add(strs[i]);
}
if(flag){
result.add("");
}
HashMap<String, String> h=new HashMap<>();
for(String str: s){
String st=mySort(str);
if(h.get(st)!=null){
for(int i=0; i<hCount.get(str); i++){
result.add(str);
}
h.put(st, h.get(st).replace("0", "1"));
}
else{
h.put(st, str+"0");
}
}
for(String st: h.keySet()){
String t=h.get(st);
if(t.charAt(t.length()-1)=='1'){
for(int i=0; i<hCount.get(t.substring(0, t.length()-1)); i++){
result.add(t.substring(0, t.length()-1));
}
}
}
return result;
}
private String mySort(String str){
char[] c=str.toCharArray();
Arrays.sort(c);
StringBuilder sb=new StringBuilder();
for(int i=0; i<c.length; i++){
sb.append(c[i]);
}
return sb.toString();
}
}
测试了几个样例,对于["abc","abc","bcd","dcb","bcd"],输出["dcb", "bcd", "bcd"],能够过滤掉重复的非乱序字符串,但是不会过滤掉重复的乱序字符串。