【面试算法】——字符串(四)

目录

一、字符串的逆序调整

题型:

思路:

代码举例:

二、字符串移位

题型:

思路:

代码举例:

三、拼接最小字典序

题型:

思路:

代码举例:

一、字符串的逆序调整

题型:

给定一个字符串str,请在单词间做逆序调整,举例:

“pig loves dog”逆序成“dog loves pig”。

思路:

首先我们需要实现一个函数,这个函数可以做到将字符串局部所有字符逆序。具体的做法为,首先将这个范围上的第一个字符和倒数第一个字符交换,然后让第二个字符和倒数第二个字符进行交换;最后直到中间交换完毕,这样函数就实现了。

那么利用这个函数就可以解题了,首先我们将原句子中的字符全部用函数倒序过来,然后找到逆序字符串中的每个单次区域,利用f将每一个单词的区域逆序。

也就是首先将“pig loves dog”逆序为:“god sevol gip”

然后对每一个单词进行逆序得到:“dog loves pig”

代码举例:

import java.util.*;

public class Reverse {
    public String reverseSentence(String A, int n) {
        // write code here
        if(A==null ||n==0){
            return A;
        }
        //首先将字符串转换为字符数组
        char[] ch = A.toCharArray();
        //首先将字符串全部逆序
        reverse(ch,0,n-1);
        //定义两个变量,一个表示单词的左边,一个表示单词的右边
        int left = 0;
        int right = -1;
        //然后对每一个单词逆序,这里寻找单词长度的方法为,寻找空字符
        for(int i=0;i<n;i++){
            if(ch[i] == ' ' ){
                right = i-1;
                reverse(ch,left,right);
                left = i+1;
            }else if(i == n-1){
                right = i;
                reverse(ch,left,right);
            }
        }
        return String.valueOf(ch);
    }
    //首先创建逆序函数
    public void reverse(char[] a,int start,int end){
        while(start<end){
            //将两个坐标的字符进行交换
            char temp = a[start];
            a[start] = a[end];
            a[end] = temp;
            //继续交换第二个和倒数第二个数
            start++;
            end--;
        }
    }
}

 

二、字符串移位

题型:

给定一个字符串str,以及一个整数i.i代表str中的位置,然后将str【0】到str【i】移动到字符的右侧,将str【i】到str【n-1】的字符串移动到左侧。

思路:

那么这种题型和前面一种类似,同样可以使用逆序函数,巧妙的实现,那么首先我们创建一个逆序函数,然后我么你首先将str【0】到str【i】的字符串进行逆序操作,然后对str【i】到str【n-1】的字符串进行逆序,最后对整个字符串进行逆序操作,最终得到结果。

代码举例:

import java.util.*;

public class Translation {
    public String stringTranslation(String A, int n, int len) {
        // write code here
        if(A==null ||n==0){
            return A;
        }
        //首先将字符串转换为字符数组
        char[] ch = A.toCharArray();
        //交换0到i-1位置的字符
        reverse(ch,0,len-1);
        //然后交换i到n-1位置的字符
        reverse(ch,len,n-1);
        //最后交换全部的字符串
        reverse(ch,0,n-1);
        return String.valueOf(ch);
    }
    //首先创建逆序函数
    public void reverse(char[] a,int start,int end){
        while(start<end){
            //将两个坐标的字符进行交换
            char temp = a[start];
            a[start] = a[end];
            a[end] = temp;
            //继续交换第二个和倒数第二个数
            start++;
            end--;
        }
    }
}

三、拼接最小字典序

这里首先我们需要理解所谓的字典序是什么意思

我的看法是,在生活中字符串的排列存在一种顺序,就好像123456,或者abcdef这些字符都有相应的顺序,这种顺序我们规定在字典中,而字典序表示的就是一串字符串中字符排列顺序与字典顺序的特和程度

例如:

str1=“123”,str2=“45”,将这两个字符串拼接成一个长字符串,有两种方式,一种是“12345”,一种是“45123”,相比而言,第一种方式的字典序就要小一些。所以,对于这个“1”“2”“3”“4”“5”这几个字符进行排列,字典序最小的情况是“12345”,字典序最大的情况是“54321”。

题型:

给定一个字符串类型的数组strs,请找到一种拼接顺序,使得将所有字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的并放回这个大字符串。

思路:

首先,这种题目的最优的时间复杂度O(N*logN)。

思路为:首先我们在比较时,不能通过比较单独的字符串的字典序,例如:“b”和“ba”,如果只比较单独的字符串的字典序,那么应该拼接成“bba”,但事实是应该拼接成“bab”。

 我们应该比较str1+str2和str2+str1的字典序。(Java中存在一个Comparator接口,这个接口表示一个比较器,这样一来在使用Arrays.sort方法时,就可以根据自定义的排序方式排序了,同时调用String类中的CompareTo方法可以实现字典序的比较)

代码举例:

import java.util.*;
class MyComparator implements Comparator<String> {
 
    @Override
    public int compare(String s1, String s2) {
        return (s1 + s2).compareTo(s2 + s1);
    }
}
public class Prior {
    public String findSmallest(String[] strs, int n) {
        // write code here
        if(strs == null){
            return null;
        }
        if(strs.length<=1){
            return String.valueOf(strs);
        }
        Arrays.sort(strs, new MyComparator());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < strs.length; i++)
            sb.append(strs[i]);
        return sb.toString();
    }
}

 

 

 

 

 

 

 

    原文作者:CodeLikeWind
    原文地址: https://blog.csdn.net/qq_36125072/article/details/81698916
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞