输入包含多行,第一行包含一个整数n,代表字符串数组strs的长度,后面n行,每行一个字符串,代表strs[i](保证所有字符串长度都小于10)。
输出一行,包含一个字符串,代表返回的字典序最小的字符串。
2 abc de
abcde
2 b ba
bab
时间复杂度,额外空间复杂度。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXLEN 11 int comp(const void *a, const void *b); int main(void) { int n; char **strs, *str, *res; scanf("%d", &n); strs = (char **) malloc(sizeof(char *) * n); for (int i = 0; i < n; i++) { str = (char *) malloc(MAXLEN); scanf("%s", str); strs[i] = str; } qsort(strs, n, sizeof(char *), comp); res = (char *) malloc((MAXLEN - 1) * n + 1); res[0] = '\0'; for (int i = 0; i < n; i++) { strcat(res, strs[i]); free(strs[i]); } printf("%s\n", res); free(strs); free(res); return 0; } int comp(const void *a, const void *b) { char *s1, *s2; s1 = (char *) calloc(MAXLEN << 1, 1); s2 = (char *) calloc(MAXLEN << 1, 1); strcat(s1, *(char **) a); strcat(s1, *(char **) b); strcat(s2, *(char **) b); strcat(s2, *(char **) a); int ans = strcmp(s1, s2); free(s1); free(s2); return ans; }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; public class Main{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] strs = new String[n]; for(int i = 0; i < n; i++) strs[i] = br.readLine(); Arrays.sort(strs, new Comparator<String>(){ @Override public int compare(String s1, String s2) { return (s1 + s2).compareTo(s2 + s1); } }); StringBuilder sb = new StringBuilder(); for(int i = 0; i < n; i++) sb.append(strs[i]); System.out.println(sb.toString()); } }
#include <bits/stdc++.h> using namespace std; bool compare(string a, string b) { return (a + b) < (b + a);// 按照 str1+str2 ≤ str2+str1方式排序 } string lowestString(vector<string> strs) { if (strs.empty()) { return ""; } sort(strs.begin(),strs.end(),compare); string res = ""; for (int i = 0; i < strs.size(); ++i) { res += strs[i]; } return res; } int main() { int n; scanf("%d", &n); vector<string> str(n); for(int i= 0; i < n; i++) { cin >> str[i]; } cout << lowestString(str); }
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n ; vector<string> vec; for (int i = 0; i < n; i ++) { string tmp; cin >> tmp; vec.push_back(tmp); } auto cmp = [] (string s1,string s2) -> bool { int x =(s1 + s2) .compare(s2 + s1); if (x < 1) return true; return false; }; make_heap(vec.begin(),vec.end(),cmp); sort_heap(vec.begin(),vec.end(),cmp); for (auto x : vec) { cout << x; } return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] strs = new String[n]; for(int i=0;i<n;i++){ strs[i] = sc.next(); //System.out.print(strs[i]); } System.out.println(lowestString(strs)); } public static String lowestString(String strs[]){ if(strs == null||strs.length == 0) return ""; Arrays.sort(strs,new Mycomparator()); StringBuilder res = new StringBuilder(); for(int i=0;i<strs.length;i++){ res.append(strs[i]); } return res.toString(); } } class Mycomparator implements Comparator<String>{ @Override public int compare(String a,String b){ return (a+b).compareTo(b+a); } }
package main import "fmt" import "bytes" import "sort" //对 sarr 排序 func minDicOrder(sarr []string) []string { sort.Slice(sarr, func(i, j int) bool { return sarr[i]+sarr[j] < sarr[j]+sarr[i] }) return sarr } //获得字符串总长度,以分配内存 func length(sarr []string) int { var sum int for _, str := range sarr { sum += len(str) } return sum } func main() { //输入输出 var count int _, err := fmt.Scan(&count) if err != nil { panic(err) } sarr := make([]string, count) for i := 0; i < count; i++ { _, err := fmt.Scan(&sarr[i]) if err != nil { panic(err) } } //切片排序 orderArr := minDicOrder(sarr) //使用 bytes.Buffer, 防止字符串频繁分配造成的GC压力, var b bytes.Buffer //After Grow(n), at least n bytes can be written to the buffer without another allocation. b.Grow(length(sarr)) for _, str := range orderArr { b.Write([]byte(str)) } fmt.Println(b.String()) }
#include<cstdio> (802)#include<iostream> #include<string> (765)#include<vector> #include<algorithm> using namespace std; vector<string> v; int cmp(string s1,string s2){ return s1+s2<s2+s1; } int main(){ int n; scanf("%d",&n); v.resize(n); for(int i=0;i<n;++i){ cin>>v[i]; } sort(v.begin(),v.end(),cmp); for(int i=0;i<n;++i){ cout<<v[i]; } return 0; }
import sys import functools n = int(input()) strs = list() while n >= 0: l = sys.stdin.readline().strip() if l is not '': strs.append(l) n = n - 1 def custom_sort(x, y): if (x+y) < (y+x): return -1 else: return 1 return 0 strs = sorted(strs,key = functools.cmp_to_key(custom_sort)) print(''.join(strs))