题目
给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的,并且以前按照一些自定义的顺序排序。
对 s 的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 order 中的字符 x 出现字符 y 之前,那么在排列后的字符串中, x 也应该出现在 y 之前。
返回 满足这个性质的 s 的任意排列 。
示例 1:
输入: order = "cba", s = "abcd"
输出: "cbad"
解释:
“a”、“b”、“c”是按顺序出现的,所以“a”、“b”、“c”的顺序应该是“c”、“b”、“a”。
因为“d”不是按顺序出现的,所以它可以在返回的字符串中的任何位置。“dcba”、“cdba”、“cbda”也是有效的输出。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/custom-sort-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:自定义排序法
- 解题思路:
先算出每个字母的权重,然后自定义排序一下
public static String customSortString(String order, String s) {
int[] orderPower= new int[26];
int power=order.length();
for (int i = 0; i < order.length(); i++) {
orderPower[order.charAt(i)-'a']=power;
power--;
}
Character[] arr = new Character[s.length()];
for (int i = 0; i < s.length(); ++i) {
arr[i] = s.charAt(i);
}
Arrays.sort(arr, new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
return orderPower[o2-'a']-orderPower[o1-'a'];
}
});
StringBuilder stringBuilder = new StringBuilder();
for (Character c:
arr) {
stringBuilder.append(c);
}
return stringBuilder.toString();
}
解法二:
- 先根据排序字段把所有排序字段中的字排序输出,然后再循环一遍,把开始没输出的字段也输出了
public static String customSortString2(String order, String s) {
StringBuilder stringBuilder= new StringBuilder();
boolean[] used= new boolean[s.length()];
for (int i = 0; i<order.length() ; i++) {
for (int j = 0; j < s.length(); j++) {
if(s.charAt(j)==order.charAt(i))
{
stringBuilder.append(s.charAt(j));
used[j]=true;
}
}
}
for (int j = 0; j < s.length(); j++) {
if(!used[j])
{
stringBuilder.append(s.charAt(j));
}
}
return stringBuilder.toString();
}
解法三:哈希法
- 解题思路:
设置一个LinkedHashMap<Character,StringBuilder>。把排序字段插入,最后插入一个,非字母的字节。
把输入字符串,插入这个哈希字典中。最后在遍历输出。
public static String customSortString3(String order, String s) {
LinkedHashMap<Character,StringBuilder> linkedHashMap= new LinkedHashMap<>();
for (int i = 0; i < order.length(); i++) {
linkedHashMap.put(order.charAt(i),new StringBuilder());
}
linkedHashMap.put('-',new StringBuilder());
for (int i = 0; i < s.length(); i++) {
if (linkedHashMap.containsKey(s.charAt(i)))
{
linkedHashMap.get(s.charAt(i)).append(s.charAt(i));
}
else
{
linkedHashMap.get('-').append(s.charAt(i));
}
}
StringBuilder rs= new StringBuilder();
for (Character c:
linkedHashMap.keySet()) {
rs.append(linkedHashMap.get(c));
}
return rs.toString();
}
标签:String,自定义,int,StringBuilder,字符串,new,排序,order,linkedHashMap
From: https://www.cnblogs.com/huacha/p/16885953.html