单词排序 --- lintcode 819

点击打开题目

上面的超链接链向原题,原题的题意是给定新的字母表,让我们用新字母表的顺序给给定的字符串按照字典排序法排序。


思路:

其实题意就是字母的一对一替换,将得到的字符串用原来的字母表示出来,将结果进行排序后,反编译回现在的字母表示即可。


代码如下:

public class Solution {
    /**
     * @param alphabet: the new alphabet
     * @param words: the original string array
     * @return: the string array after sorting
     */
    public String[] wordSort(char[] alphabet, String[] words) {
		String[][] temp = new String[words.length][2];
		for (int i = 0; i < temp.length; i++) {
			temp[i][0] = words[i];
			temp[i][1] = calculate(words[i], alphabet);
		}

		Arrays.sort(temp, new Comparator<String[]>() {

			public int compare(String[] s1, String[] s2) {
				if (s1[1].startsWith(s2[1])) {
					return 1;
				}
				if (s2[1].startsWith(s1[1])) {
					return -1;
				}

		    	for (int i = 0; i < s1[1].length() && i < s2[1].length(); i++) {
					char c1 = s1[1].charAt(i);
					char c2 = s2[1].charAt(i);
					if (c1 != c2) {
						if (c1 > c2) {
							return 1;
						} else {
							return -1;
						}
					}
				}
				return 0;
			}

		});

		String[] ret = new String[temp.length];
		for (int i = 0; i < ret.length; i++) {
			ret[i] = temp[i][0];
		}
		return ret;
	}

	private String calculate(String string, char[] alphabet) {
		String normal = "abcdefghijklmnopqrstuvwxyz";
		String unusual = new String(alphabet);
		StringBuilder strb = new StringBuilder();

		int index;
		for (int i = 0; i < string.length(); i++) {
			index = unusual.indexOf(string.charAt(i));
			strb.append(normal.charAt(index));
		}

		return strb.toString();
	}
}


猜你喜欢

转载自blog.csdn.net/mio_bass/article/details/79486565