给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。
样例
对于字符串数组 ["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) {
String[] strs2 = new String[strs.length];
for (int i = 0; i < strs.length; i++) {
strs2[i] = getSign(strs[i]);
}
Map<String, Integer> map = new HashMap<>();
ArrayList<Integer> idlist = new ArrayList<>();
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < strs2.length; i++) {
if (strs[i].equals("")) {
idlist.add(i);
} else {
if(map.containsKey(strs2[i])){
if (map.get(strs2[i]) >= 0) {
idlist.add(map.get(strs2[i]));
map.put(strs2[i], -1);
}
idlist.add(i);
} else {
map.put(strs2[i], i);
}
}
}
for (Integer i : idlist) {
list.add(strs[i]);
}
return list;
}
public static String getSign(String s) {
int count[] = new int[26];
char[] c = s.toCharArray();
for (char q : c) {
count[q - 97]++;
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < 26; i++) {
if (count[i] > 0) {
b.append((char) (i + 97));
b.append(count[i]);
}
}
String m=b.toString();
return m;
}
}