【分解让复杂问题简单化】字符串的排列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ghscarecrow/article/details/82053437

此题出自牛客网的剑指offer专题

题目描述

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

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解题思路

该题主要的算法思想就是回溯法的运用。有一张图很好地说明了这个算法思路

代码如下

Java版本

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> result = new ArrayList<>();
        if(str!=null && str.length()>0){
            PermutationHelper(result,0,str.toCharArray());
            Collections.sort(result);//保证按照字典序输出
        }
        return result; 
    }
    
    public void PermutationHelper(ArrayList<String> result,int begin,char[] cs){
        if(begin == cs.length-1){
            String val = String.valueOf(cs);
            //如果结果集中不包含这种情况则添加(防止重复)
            if(!result.contains(val)){
                result.add(val);
            }
        } else {
            for(int j=begin;j<cs.length;j++){
                swap(cs,j,begin);
                PermutationHelper(result,begin+1,cs);
                //回溯法的关键->复位
                swap(cs,j,begin);
            }
        }
    }
    
    public void swap(char[] cs,int begin,int j){
        char temp = cs[begin];
        cs[begin] = cs[j];
        cs[j] = temp;
    }
}

C++版本

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        if(str.length()==0)
        {
            return result;
        }
        PermutationHelper(result,str,0);
        sort(result.begin(),result.end());//保持字典序
        return result;
    }
    
    void PermutationHelper(vector<string> &result,string str,int begin)
    {
        if(begin == (int)str.length())
        {
            result.push_back(str);
            return;
        }
        for(int i = begin;str[i]!='\0';i++)
        {
            if(i != begin && str[begin]==str[i])
            {
                continue;
            }
            swap(str[begin],str[i]);
            PermutationHelper(result,str,begin+1);
            swap(str[begin],str[i]);
        }
    }
};

猜你喜欢

转载自blog.csdn.net/ghscarecrow/article/details/82053437