lintcode:anagrams 乱序字符串

时间:2024-08-30 23:06:38

题目

乱序字符串

给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。

您在真实的面试中是否遇到过这个题?
Yes
样例

对于字符串数组 ["lint","intl","inlt","code"]

返回 ["lint","inlt","intl"]

注意

所有的字符串都只包含小写字母

解题

感觉很简单,搞了近两个小时,写了下面的程序

public class Solution {
/**
* @param strs: A list of strings
* @return: A list of strings
*/
public List<String> anagrams(String[] strs) {
// write your code here
List<String> list = new ArrayList<String>();
if(strs.length == 0 || strs ==null)
return list;
int i=0;
int j=0;
int k = -1;
while(i<strs.length ){
while(j< strs.length ){
if(compare(strs[i],strs[j])){
k=i;
break;
}else{
j++;
}
}
if(k==i) break;
i++;
}
if(k==-1)
return list;
list.add(strs[k]);
for( i=0;i<strs.length ;i++)
if(i!=k && compare(strs[k],strs[i]))
list.add(strs[i]);
return list;
}
public boolean compare(String str1,String str2){
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
if(str1.length()!= str2.length())
return false;
for(int i=0;i<str1.length();i++){
char ch = str1.charAt(i);
if(!map.containsKey(ch)){
map.put(ch,1);
}else{
map.put(ch,map.get(ch)+1);
}
}
for(int j=0;j<str2.length();j++){
char ch = str2.charAt(j);
if(!map.containsKey(ch)){
return false;
}else{
map.put(ch,map.get(ch)-1);
if(map.get(ch)<0)
return false;
}
}
return true;
}
}

Java Code

然而可以有多个

输入
["tea","","eat","","tea",""]
输出
["eat","tea","tea"]
期望答案
["","","","eat","tea","tea"]

简书给的程序很好,或者说作者很会想,把由相同字母组成的单词映射到同一个key值

这里,对单词排序后,统计出现的次数,也是让映射的key值唯一

programcreek 也是排序的方法

Java

public class Solution {
/**
* @param strs: A list of strings
* @return: A list of strings
*/
public List<String> anagrams(String[] strs) {
// write your code here
List<String> list = new ArrayList<String>();
if(strs == null || strs.length ==0)
return list;
Map<String,Integer> map = new HashMap<String,Integer>();
String[] strs2 = new String[strs.length];
for(int i=0;i< strs.length;i++){
char[] ch = strs[i].toCharArray();
Arrays.sort(ch);
strs2[i] = String.valueOf(ch);
if(!map.containsKey(strs2[i])){
map.put(strs2[i],1);
}else{
map.put(strs2[i],map.get(strs2[i]) + 1);
}
}
for(int i=0;i<strs.length;i++){
if(map.get(strs2[i]) >1)
list.add(strs[i]);
}
// if(strs.length >=6)
// System.out.println(0);
return list;
}
}

Java Code