lintcode | 171.亂序字串
阿新 • • 發佈:2019-01-04
題目
給出一個字串陣列S,找到其中所有的亂序字串(Anagram)。如果一個字串是亂序字串,那麼他存在一個字母集合相同,但順序不同的字串也在S中。
注意事項
所有的字串都只包含小寫字母樣例
對於字串陣列 [“lint”,”intl”,”inlt”,”code”]
返回 [“lint”,”inlt”,”intl”]
思路
一,使用HashMap,亂序字串擁有同樣的key,亂序字串放入ArrayList< String >中,作為value
二,key該是什麼形式? 字元+個數 “abadc”——> “a2b1c1d1”
三,首先:將陣列S中元素put進hash中
然後:獲取hash的values,遍歷,若value.size()>1,則為一組亂序字串
程式碼
public class Solution {
/**
* @param strs: A list of strings
* @return: A list of strings
*/
public ArrayList<String> anagrams(String[] strs)
{
HashMap<String,ArrayList<String>> hash=new HashMap<String,ArrayList<String>>();
for(String str:strs)
{
String key=generalString(str);
ArrayList<String> res=hash.get(key);
if(res==null)
{
res=new ArrayList<String>();
hash.put(key, res); //沒有此<key,value>時,將其put進hashmap中
}
res.add(str); //在此給value ArrayList<String>新增遍歷到的String
}
ArrayList<String> resSet =new ArrayList<String>();
for(ArrayList<String> anagram:hash.values())
{
if(anagram.size()>1) resSet.addAll(anagram); //addAll 新增ArrayList<String>
}
return resSet;
}
public String generalString(String s)
{
int[] a=new int[26];
int i;
for(i=0;i<s.length();i++)
{
a[(int)s.charAt(i)-'a']++;
}
StringBuilder sb=new StringBuilder();
for(i=0;i<26;i++)
{
if(a[i]!=0)
{
sb.append((char)('a'+i));
sb.append(a[i]);
}
/* if(a[i]==0) continue;
sb.append((char)('a'+i));
sb.append(a[i]);*/
}
return sb.toString();
}
}
知識點
HashMap定義,初始化
HashMap< String,ArrayList< String>> hash=new HashMap< String,ArrayList< String>>();HashMap新增元素
hash.put(key,res);HashMap由key取value
ArrayList< String> res=hash.get(key);HashMap中所有值
hash.values()陣列的另一種遍歷方法
for(String str:S){ …. }ArrayList< T> A 新增 ArrayList< T> a的所有元素
A.addAll(a);