Anagrams
Given an array of strings, return all groups of strings that are anagrams.
本题在开始写的代码很繁琐,如下,作为参考,没有用set判断,所以很繁琐,效率也不高。
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
思路:这题要是解,必须知道什么是回文构词法。所谓回文构词法就是把一个单词的顺序调整,形成新的单词,如”eat“,"tea"就是回文构词法。
所以回文构词法一定是相同的字母不同的顺序,而且最少有两个单词。
本题是将单词排序之后运用set查看是否重复,来判断是否回文构词。具体代码如下:
public class Solution {
public List<String> anagrams(String[] strs) {
List<String> list = new ArrayList<String>();
if(strs.length <= 1){
return list;
}
Map<String,Integer> map = new HashMap<>();
Set<String> set = new HashSet<>();
boolean[] b = new boolean[strs.length];//为每个字符串标记,初始均为false
//处理字符串,变成有序的字符数组
for(int i = 0; i < strs.length;i++){
char[] c = strs[i].toCharArray();
Arrays.sort(c);
StringBuffer sb = new StringBuffer();
for(char k:c){
sb.append(k);//将char数组转换成字符串
}
if(!set.add(sb.toString())){//里面已经存在相同的字符数组
list.add(strs[i]);
int index = map.get(sb.toString());
if(!b[index]){//还没有添加到list
list.add(strs[index]);
b[index] = true;//将标记置为true,
}
}else{
map.put(sb.toString(),i);//保存首次出现的字符串的索引i
set.add(sb.toString());//保存set,下次判断是否重复
}
}
return list;
}
}
本题在开始写的代码很繁琐,如下,作为参考,没有用set判断,所以很繁琐,效率也不高。
public class Solution {
public List<String> anagrams(String[] strs) {
List<String> list = new ArrayList<String>();
if(strs.length <= 1){
return list;
}
Map<Integer,char[]> map = new HashMap<>();
//处理字符串,变成有序的字符数组
for(int i = 0; i < strs.length;i++){
char[] c = strs[i].toCharArray();
Arrays.sort(c);//排序
map.put(i, c);
}
boolean[] b = new boolean[strs.length];//为每个字符串标记,初始均为false
for(int k = 0; k < strs.length -1 ; k++){
if(!b[k]){//没有被标记
char[] c0 = map.get(k);//假定第k个字符串是回文构词
for(int i = k + 1; i < strs.length;i++){//从i=1开始
if(!b[i] && c0.length == strs[i].length()){//没有被判断是,且与c0字符数相等
char[] c1 = map.get(i);//数组化
int j = 0;
while( j < c0.length){
if(c0[j] != c1[j]){
break;//如果不相同直接break
}else{
j++;//相同+1
}
}
if(j == c0.length){//说明字全部相同
list.add(strs[i]);
b[k] = true;//开始那个也要标记
b[i] = true;//标记已是
}
}
}
if(b[k]){//如果初始已标记,则在list加上
list.add(strs[k]);
}
}
}
return list;
}
}