字符串相关题目

来源:互联网 发布:58上面网络销售可靠吗 编辑:程序博客网 时间:2024/05/21 09:08


一、判断两个字符串str1str2,是否互为旋转词

(字符串str左边任意长度的子串挪到右边:“1234”的旋转词有1234234134124123)。

时间复杂度为On

 

做法:(1)判断两字符串长度是否相等

(2)长度相等,生成str1+str1的大字符串(大字符串包含了str1的所有旋转词)

(3)在大字符串中寻找是否包含str2,可以KMP算法,但本例子没有

public static boolean circle(String s1,String s2){if(s1.length()!=s2.length()) return false;String s=s1+s1;for(int i=0;i<s2.length();i++){String subString=s.substring(i,s2.length()+i);if(s2.equals(subString)) return true;}return false;}



二、给定一个字符串str,请在单词间做逆序调整

例子:“pig loves dog”-->“dog loves pig”. 

Im a student-->student a  Im

思路:(1)字符串局部所有字符逆序函数f :比如 “abc def”->fed cba

(2)转化成各单词,调用f函数再逆序 “def” abc

思路2:string-->string[] ,对数组元素逆序  

 

三、字符串str,str[0...i]移到右侧,str[i+1...N-1]移到左侧,要求时间复杂度O(n),空间复杂度O(1)。 例子:abcde,  i=2-->deabc

思路:题目要求空间复杂度O (1),所以不能用字符串连接来做。利用题2中的逆序函数f原地调整

(1)0...i,逆序:cbade

(2)i+1..n-1逆序:cbaed

(3)整体逆序:deabc


四、字符串数组strs[],找到拼接顺序,使所有str拼接组成的大字符串是字典顺序最小的,返回大字符串。比如:abc,de,-->应该是abcde不是deabc。b,ba-->应该是bab不是bba。

最优解的时间复杂度O(nlogn)

其实是一种排序的实现。类似于把数组排成最小的数。

思路:如果字典顺序是str1+str2<str2+str1,那么str1要排在str2之后。

(1)对于给定的数组排序,自定义比较器Comparator,并实现compareTo()方法来比较两个元素之间的大小,(由于str1+str2和str2+str1长度相同的两个字符串,他们的比较就是比较他们的字典序,使用String已有的conpareTo()比较,其原理还是逐个比较ascii码,由于ascii码的顺序和字典序相同)

(2)使用排序的类库Arrays.sort(new Comparator());最终将最小排序下的元素拼接成为字符串就是字典序最小的字符串。

class MyComparator implements Comparator<String>{public int compare(String str1,String str2){String s1=str1+str2;String s2=str2+str1;return s1.compareTo(s2);}}

public static String smallestStr(String[] strs,int n){if(strs==null||strs.length==0) return null;if(strs.length==0) return "";Arrays.sort(strs,new MyComparator());StringBuilder sbBuilder=new StringBuilder();for(int i=0;i<strs.length;i++){sbBuilder.append(strs[i]);}return sbBuilder.toString();}