美文网首页
字符串的排列(剑指offer 28题及课后题拓展)

字符串的排列(剑指offer 28题及课后题拓展)

作者: 抬头挺胸才算活着 | 来源:发表于2020-02-26 20:59 被阅读0次
  • permutation
    输入abc,得到abc,acb,bac,bca,cba,cab
    思路就是将输入的字符串的第一个字符跟后面的进行交换,也就是到不同的位置得到不同的排列,这样的解释对后面不大直观,应该说是第一个位置都有字符串所有的字符坐过,然后再递归后面。
    比如abc
    abc
    再递归对bc进行
    bac
    ...
    cba
    ....
import java.util.HashSet;
import java.util.Scanner;

public class Permutation {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        if(sc.hasNextLine()) {
            String string = sc.nextLine();
            int count = numOfPermutation(string);
            System.out.println(count);
        }
    }

    public static int numOfPermutation(String string){
        if(string==null)
            return 0;

        HashSet<String> set = new HashSet<>();
        numOfPermutation(new StringBuilder(string), set, 0);
        return set.size();
    }

    public static void numOfPermutation(StringBuilder sb, HashSet<String> set, int startIndex){
        if(startIndex==sb.length()-1) {
            set.add(sb.toString());
        } else {
            for(int i=startIndex;i<sb.length();i++) {
                swap(sb, startIndex, i);
                numOfPermutation(sb, set, startIndex+1);
                swap(sb, startIndex, i);
            }
        }
    }

    public static void swap(StringBuilder sb, int i, int j){
        char ichar = sb.charAt(i), jchar=sb.charAt(j);
        sb.setCharAt(i, jchar);
        sb.setCharAt(j, ichar);
    }
}

  • 所有长度的permutation
    输入abc得到 a,ab,abc,ac,acb,b,ba,bac,bc,bca,c,cb,cba,ca,cab
    public static void permutation2(String string) {
        permutation2(string.toCharArray(), 0);
    }

    public static void permutation2(char[] charArray, int startIndex) {
        for(int i=startIndex; i<charArray.length; i++) {
            utils.swap(charArray, startIndex, i);
            System.out.print(new String(Arrays.copyOf(charArray, startIndex+1))+",");
            utils.swap(charArray, startIndex, i);
        }
    }
  • 组合
    输入abc,得到a,b,c,ab,ac,bc,abc,没有顺序。
    基本的思想就是递归,把原始的字符串不变顺序,从前后到后面,每次都对每个字符进行选择或者不选择,选择那么就把问题降为在剩下的字符中选择n-1个,不选择就还是在剩下的字符中选择n个。
    public static void combination(String string){
        for(int i=0;i<string.length();i++) {
            Queue<Character> queue = new LinkedList<>();
            combination(string.toCharArray(), 0,i+1, queue);
        }
    }

    public static void combination(char[] charArray, int fromIndex, int numCharsTobeSelected, Queue<Character> queue) {
        if (numCharsTobeSelected == 0) {
            for (Character ch : queue) {
                System.out.print(ch);
            }
            if(queue.size()>0)
                System.out.println();
            return;
        }

        int NumCharsLeft = charArray.length - fromIndex;
        if(NumCharsLeft < numCharsTobeSelected){
            return;
        }

        queue.add(charArray[fromIndex]);
        combination(charArray, fromIndex+1, numCharsTobeSelected - 1, queue);
        queue.poll();

        combination(charArray, fromIndex+1, numCharsTobeSelected, queue);
    }

相关文章

网友评论

      本文标题:字符串的排列(剑指offer 28题及课后题拓展)

      本文链接:https://www.haomeiwen.com/subject/rgpwchtx.html