字符串旋转词、句子逆序化、字符串移位、最小字典序字符串问题

一:旋转词

    把字符串前面任意部分挪到后面叫做词的旋转,如:1234—>2341—>3412....

    给定两个词,判断是否互为旋转词。

    规律:只要把字符串A自身拼接到A末尾,那么A的旋转词都包含在A+A中了,所以只需在A+A中找B是否存在即可。

    如:1234+1234=12341234

    A的旋转词有:2341、3412、4123,分别对应12341234、12341234、12341234

    public boolean chkRotation(String A, int lena, String B, int lenb) {
        String sum=A+A;
        return sum.contains(B);
    }

二:句子逆序

    把句子的单词顺序逆序,注意:不是单词逆序。

    dog loves pig——>pig loves dog

   思路:“负负得正”,先对整个句子范围逆序,然后对每个单词范围逆序

   重点:范围的控制,单词范围以空格划分。

   代码实现:分两步,首先定义一个范围逆序函数;然后分别对整个句子逆序、遍历逆序后句子确定单词范围对单词范围逆序。

   public void rangeReverse(char[] str,int beg,int end){
        if(str==null||str.length<=0){
            return;
        }
        //前后交换的实现:前下标 小于 后下标,即可互换。停止条件为二者相遇或越过对方
        while(beg<end){
          char temp=str[beg];
          str[beg]=str[end];
          str[end]=temp;
          beg++;
          end--;
        }
    }
    public String reverseSentence(String A, int n) {
        char[] charsA=A.toCharArray();
        //对整个句子逆序
        rangeReverse(charsA,0,n-1);
        int i=0,start=0;
        
        while(i<n){
            //寻找空格
            while(i<n&&charsA[i]!=' ')i++;
            //逆序单词start到空格前一个字符范围
            rangeReverse(charsA,start,i-1);
            
            //下一个单词开始
            i++;
            start=i;
        }
        return new String(charsA);
    }

三:字符串移位

    将字符串的长度为len的前缀平移到字符串的最后,如:ABCDE—>CDEAB

    思路:还是范围逆序的使用。

    首先对0~len-1逆序;

    然后对len~string.length-1逆序;

    最后,对整个字符串范围逆序即可。

     public void rangeReverse(char[] str,int beg,int end){
        if(str==null||str.length<=0){
            return;
        }
        while(beg<end){
          char temp=str[beg];
          str[beg]=str[end];
          str[end]=temp;
          beg++;
          end--;
        }
    }
    public String stringTranslation(String A, int n, int len) {
        char[] chars=A.toCharArray();
        rangeReverse(chars,0,len-1);
        rangeReverse(chars,len,n-1);
        rangeReverse(chars,0,n-1);
        
        return new String(chars);
    }

四:按最小字典序拼接字符串

    对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。

    思路:该题实际上是对数组中的字符串排序,使得整个字符串数组中字典序小的在前面,最后用排序后字符串数组拼接出来的字符串字典序就是最小的。

    不过要注意特殊情况,比如“b”和“ba“,按原生字典序排序是”bba“这样的顺序,但实际上”bab“才是拼接字符串字典序才是最小的。

    所以问题的关键为:改变排序方式,不是简单的字典序比较排序,而是对相邻字符串,s1+s2<s2+s1,则s1在前面。  

//自定义比较器
class MyComparator implements Comparator<String>{
   //重写compare方法
    public int compare(String str1,Stringstr2){
        String s1=str1+str2;
        String s2=str2+str1;
        return s1.compareTo(s2);
    }

  public String findSmallest(String[] strs,int n) {
        if(strs==null||strs.length<0) returnnull;
        if(strs.length==0) return "";
       
       //使用自定义的大小比较器对数组进行排序
        Arrays.sort(strs,new MyComparator());
       
       //返回拼接字符串
        String result="";
        for(int i=0;i<strs.length;i++){
            result+=strs[i];
        }
       
        return result;
    }
原文地址:https://www.cnblogs.com/ygj0930/p/6852582.html