您的位置:首页 > 其它

Anagrams

2014-03-03 14:25 253 查看
题目原型:

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

基本思路:
题目的意思就是说,给你一个字符串数组,让你找出里面的字母一样,但排列不同的元素,如:ate,tea,eat等等。我们可以把那些元素先排序,然后用hashMap存放。
1. 从strs的第一个元素开始遍历,首先对元素进行排序得到strtmp字符串素组;
2. 在map里查找strtmp中的元素;
3. 若不存在,将此元素以及该元素的下标存入map<string ,int>;

4. 若存在,首先将第一次出现s时的原始字符串存入结果res,即strs[map.get(i)],并将map中相应的value设置为-1(防止下次再存),再将该字符串本身存入结果res;

5. 重复以上1-4步,直到遍历结束。

public ArrayList<String> anagrams(String[] strs)
{
ArrayList<String> rs = new ArrayList<String>();
Map<String , Integer> map = new HashMap<String, Integer>();
String[] strtmp = new String[strs.length];
for(int i = 0;i<strs.length;i++)
{
strtmp[i] = sort(strs[i]);
}
for(int i = 0;i<strtmp.length;i++)
{
if(map.containsKey(strtmp[i]))
{
rs.add(strs[i]);
if(map.get(strtmp[i])!=-1)
{
rs.add(strs[map.get(strtmp[i])]);
map.put(strtmp[i], -1);
}
}
else
map.put(strtmp[i], i);
}
return rs;
}
//按字母顺序排序
public String sort(String str)
{
char[] ch = str.toCharArray();
for(int i = 0;i<ch.length;i++)
{
for(int j = 0;j<ch.length-i-1;j++)
{
if(ch[j]>ch[j+1])
{
char tmp = ch[j];
ch[j] = ch[j+1];
ch[j+1] = tmp;
}
}
}
return new String(ch);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: