【Java】编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置

来源:互联网 发布:潜水教练 知乎 编辑:程序博客网 时间:2024/05/17 03:58

编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置

只要求将变位词排在一起,没有要求这些词按照什么顺序排在一起。怎么检查两个词是不是变位词呢?统计每个字符串中各个字符出现的次数,如果两者都相同则返回true。

或者,直接将字符串进行排序,如果两个字符串排序后相同,则一定是变位词。

import java.util.Arrays;import java.util.Comparator;import java.util.Hashtable;import java.util.LinkedList;public class arrangeComparator implements Comparator<String>{public String sortChars(String s) {char[] content = s.toCharArray();Arrays.sort(content);return new String(content);}public int compare(String s1, String s2) {return sortChars(s1).compareTo(sortChars(s2));}}

这么做的时间复杂度是O(n*log(n),但其实,并不需要对整个数组排序,我们只需要将变位词都分在一起即可。

那么可以考虑用到散列表,将排序后的词映射到它的变位词链表里。

public void sort(String[] array) {Hashtable<String, LinkedList<String>> hash = new Hashtable<String, LinkedList<String>>();<span style="white-space:pre"></span>//将变位词放在同一组,key为排序后的字符串,anagrams是存放变位词的链表for(String s : array) {String key = sortChars(s);if( !hash.containsKey(key) ) {hash.put( key, new LinkedList<String>() );}LinkedList<String> anagrams = hash.get(key);anagrams.push(s);}//将散列表转换为数组int index = 0;for ( String key : hash.keySet() ) {LinkedList<String> list = hash.get(key);for (String t : list) {array[index++] = t;}}}



0 0
原创粉丝点击