JAVA: 字符串的排列和组合问题

题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public ArrayList res=new ArrayList<>();
    public ArrayList Permutation(String str) {
	       if(str!=null||str.length()>0){
	    	  PermutateHelper(str.toCharArray(), 0); 
	    	  Collections.sort(res);
	       }
	       return res;
    }
	public void PermutateHelper(char[] s,int i){
		if(i==s.length-1){
            String val=String.valueOf(s);
            if(!res.contains(val))
			    res.add(val);
		}else{
			for(int j=i;j

题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

 

分析:

在求一个字符串中所有字符的组合的时候,针对一个字符,有两种情况,假设在长度为n的字符串中选择长度为m的组合字符串,

第一是选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m-1个字符
第二是不选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m个字符
递归结束的条件就是,当m为0,即从字符串中不再选出字符的时候,这个时候已经找到了m个字符的组合,输出即可。还有一个条件是,当输入的字符串是串,自然是不能从中选出任何字符的。

import java.util.ArrayList;
import java.util.List;

public class test {
    public static void main(String ss[]) {
        perm("abc");
        System.out.println();
    }

    // 求字符串中所有字符的组合abc>a,b,c,ab,ac,bc,abc
    public static void perm(String s) {
        List result = new ArrayList();
        for (int i = 1; i <= s.length(); i++) {
            perm(s, i, result);
        }
    }

    // 从字符串s中选择m个字符
    public static void perm(String s, int m, List result) {

        // 如果m==0,则递归结束。输出当前结果
        if (m == 0) {
            for (int i = 0; i < result.size(); i++) {
                System.out.print(result.get(i));
            }
            System.out.println();
            return;
        }

        if (s.length() != 0) {
            // 选择当前元素
            result.add(s.charAt(0) + "");
            perm(s.substring(1, s.length()), m - 1, result);
            result.remove(result.size() - 1);
            // 不选当前元素
            perm(s.substring(1, s.length()), m, result);
        }
    }
}

 

你可能感兴趣的:(剑指offer)