算法刷题(一)1153.字符串排序
1.描述
给定一些由,
隔开的字符串,请将他们按字典序排列。
2.要求
- 字符串仅包含小写字母。
- 字符串数量≤1000且总长度≤10e5
3.样例
样例 1
输入: "bb,aa,lintcode,c"
输出: "aa,bb,c,lintcode"
说明: 在字典序中,"aa" < "bb" < "c" < "lintcode"
挑战:
你可以自己写一个排序函数吗?
4.思考
- ,隔开的字符串,要排序,可以将其利用split()分割为字符串数组
- 按字典序排序小写字母,String提供了compareTo比较两个字符串的字典大小
- 然后就是排序方法
方法:
public class Solution {
/**
* @param s: string
* @return: sort string in lexicographical order
*/
public String sorting(String s) {
// write your code here
String[] sarray = s.split(",");
StringBuilder news = new StringBuilder();
TwoTree tt = new TwoTree();
for (int i=0;i<sarray.length;i++ ) {
tt.addTree(sarray[i]);
}
List<String> sl = tt.sort();
for (int i=0;i<sl.size();i++ ) {
if(i == sl.size()-1) {
news.append(sl.get(i));
break;
}
news.append(sl.get(i)+",");
}
return news.toString();
}
//内部类,二叉树排序
public class TwoTree {
public String node;//中心节点
public TwoTree leftnode;//左子树
public TwoTree rightnode;//右子树
public void addTree(String v) {
//判断中心节点是否为空
if(node == null) {
node = v;
}else {
//判断节点与v的字典关系,小进左子树
if(v.compareTo(node) <= 0) {
if(leftnode == null) {
leftnode = new TwoTree();
}
leftnode.addTree(v);
}
//大进右子树
if(v.compareTo(node) > 0) {
if(rightnode == null) {
rightnode = new TwoTree();
}
rightnode.addTree(v);
}
}
}
//排序,从小到大,右子树放在上面就是从大到小
public List<String> sort(){
List<String> sl = new ArrayList<String>();
//左子树
if(null != leftnode) {
sl.addAll(leftnode.sort());
}
sl.add(node);
//右子树
if(null != rightnode) {
sl.addAll(rightnode.sort());
}
return sl;
}
}
}
5.参考答案
6.总结
这道题其实,就是好的排序方式加上比较两个字符串,字符串的比较是可以用原生方法compareTo比较,排序方式好了,时间复杂度自然就降下来了。