首页 > 试题广场 >

拼接所有的字符串产生字典序最小的字符串

[编程题]拼接所有的字符串产生字典序最小的字符串
  • 热度指数:7005 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的字符串数组 strs ,请找到一种拼接顺序,使得数组中所有的字符串拼接起来组成的字符串是所有拼接方案中字典序最小的,并返回这个拼接后的字符串。

数据范围:
进阶:空间复杂度 , 时间复杂度
示例1

输入

["abc","de"]

输出

"abcde"
示例2

输入

["a","a","b"]

输出

"aab"

备注:

import java.util.*;


public class Solution {
    /**
     * 
     * @param strs string字符串一维数组 the strings
     * @return string字符串
     */
    public String minString (String[] strs) {
        // write code here
        if(strs == null || strs.length < 1) {
            return null;
        }
        PriorityQueue<String> queue=new PriorityQueue<>(new Comparator<String>(){
            public int compare(String s1,String s2){
                return (s1+s2).compareTo(s2+s1);
            }
        });
        for(int i=0;i<strs.length;i++){
            queue.add(strs[i]);
        }
        StringBuilder str=new StringBuilder();
        while(!queue.isEmpty()){
            str.append(queue.poll());
        }
        return str.toString();
    }
}

发表于 2023-05-18 19:48:54 回复(0)
import java.util.*;


public class Solution {
    public String minString (String[] strs) {
        //Array.sort() 使用自定义比较器Comparator,比较两个元素(a,b),
        //若返回值为正数则说明发生交换,即大于0,Comparator接收返回值为正数,就会交换a和b
        Arrays.sort(strs,(a,b) -> {
            return (a + b).compareTo(b + a);
        });
//         Arrays.sort(strs,(a,b) -> ((a + b).compareTo((b + a))));
        StringBuilder sb = new StringBuilder();
        for(String s : strs) {
            sb.append(s);
        }
        return sb.toString();
    }
}

发表于 2022-06-28 13:57:56 回复(0)
import java.util.*;


public class Solution {
    /**
     * 
     * @param strs string字符串一维数组 the strings
     * @return string字符串
     */
    public String minString (String[] strs) {
        StringBuilder str = new StringBuilder();
        strs = strSort(strs,0,strs.length-1);
        // write code here
        for(int i=0;i<strs.length;i++){
            str.append(strs[i]);
        }
        String s =  str.toString();
        return s;
    }
    public String[] strSort(String[] str,int start ,int  end){
        if(start==end){
            return new String[]{str[start]};
        }
        int mid =start + (end-start)/2;
        String[] left = strSort(str,start,mid);
        String[] right = strSort(str,mid+1,end);
        String[]  newArr = new String[left.length+right.length];
        int n=0,r=0,l=0;
        while(r<right.length&&l<left.length){
            if(compare(left[l],right[r])){
                newArr[n++]=left[l++];
            }else{
                newArr[n++]=right[r++];
            }
        }
        
        while(l<left.length){
            newArr[n++]=left[l++];
        }
        while(r<right.length){
            newArr[n++]=right[r++];
        }
        return newArr;
        
    }
    public boolean compare(String s,String t){
        int n=0;
        while(s.length()>n&&t.length()>n){
            if(s.charAt(n)<t.charAt(n)){
                return true;
            }else if(s.charAt(n)>t.charAt(n)){
                return false;
            }
            n++;
        }
        if(s.length()==n){
            return true;
        }  
        return false;
    }
}
不晓得为什么不行?先排序,然后再拼接.
发表于 2022-04-06 23:14:06 回复(0)
import java.util.*;


public class Solution {
    /**
     * 
     * @param strs string字符串一维数组 the strings
     * @return string字符串
     */
    public String minString (String[] strs) {
        // write code here
        Arrays.sort(strs, (a,b) -> ((a+b).compareTo((b+a))));
        StringBuilder sb = new StringBuilder();
        for(String s : strs){
            sb.append(s);
        }
        return sb.toString();
    }
}

发表于 2022-04-05 17:05:33 回复(0)
public String minString (String[] strs) {
    // write code here
    StringBuffer sb = new StringBuffer();
    Arrays.sort(strs, new Comparator<String>(){
        @Override
        public int compare (String s1, String s2) {
            return (s1+s2).compareTo(s2+s1);
        }
    });

    for (String s:strs) {
        sb.append(s);
    }

    return sb.toString();
}

发表于 2021-08-03 10:32:15 回复(0)
import java.util.*;


public class Solution {
    /**
     * 
     * @param strs string字符串一维数组 the strings
     * @return string字符串
     */
    public String minString (String[] strs) {
        // write code here
        if(strs==null){
            return null;
        }
        return stringsort(strs);
    }
    public class MinComparator implements Comparator<String>{
        public int compare(String o1,String o2){
            return (o1+o2).compareTo(o2+o1);
        }
    }
    public String stringsort(String[] str){
        PriorityQueue<String> minPriorityQueue=new PriorityQueue<>(new MinComparator());
        for(int i=0;i<str.length;i++){
            minPriorityQueue.add(str[i]);
        }
        StringBuilder ans=new StringBuilder();
        for(int i=0;i<str.length;i++){
            ans.append(minPriorityQueue.poll());
        }
        return ans.toString();
    }
}

发表于 2021-04-29 15:45:11 回复(0)