您的位置:首页 > 编程语言 > Java开发

Java的全排列

2016-07-21 17:11 441 查看
刷剑指Offer碰到的全排列题目,就研究了一下全排算法。

1、遍历原字符串str,分别以每个字符为头进行遍历

2、将字符拼接到原StringBuffer上,在str上去除该字符,如果去除后subStr长度为1,那么直接拼接该subStr并返回

3、遍历sbuStr,对其重复1,、2步骤,进行全排。

注意两点:

1、字符串的操作,因为涉及到大量String的修改,所以使用StringBuffer会方便许多

2、注意重复字符的处理,如果遍历到的字符在之前出现过,则跳过该字符

import java.util.ArrayList;

import java.lang.StringBuffer;

public class Solution {

    public ArrayList<String> Permutation(String str) {

        ArrayList<String> arrayList = new ArrayList<String>();

        if(str==null) return arrayList;

        StringBuffer buffer = new StringBuffer();

        for(int i = 0;i<str.length();i++){

            if(str.indexOf(str.charAt(i))<i){

                continue;

            }

            FindArray(str,i,buffer,arrayList);

        }

        return arrayList;    

    }

    

    public void FindArray(String str, int pos, StringBuffer parentData,ArrayList<String> arrayList){

        if(str == null) return;

        if(str.length() == 1){  //原始str只包含一个字符

            arrayList.add(str);

            return;

        }

        

        StringBuffer buffer = new StringBuffer();  

        buffer.append(parentData);

        buffer.append(str.charAt(pos));

        

        String subStr = KitChar(str,pos);

        if(subStr.length()==1){   //只剩最后一个字符

            buffer.append(subStr);

            arrayList.add(buffer.toString());

            return;

        }

        

        for(int i = 0;i<subStr.length();i++){

            if(subStr.indexOf(subStr.charAt(i))<i){

                continue;

            }

            FindArray(subStr, i, buffer, arrayList);

        }

        

    }

    

    public String KitChar(String str,int pos){   //删除字符串str中第pos个字符

        StringBuffer srcBuf = new StringBuffer();  

        srcBuf.append(str);

        srcBuf.deleteCharAt(pos);

        return srcBuf.toString();        

    }

    

}

参考:http://airu.iteye.com/blog/1930391
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stringbuffer 算法