38_剑指offer_java_字符串的排列

目录

 

题目描述

测试用例

题目考点

解题思路

自己解题

参考解题

扩展


题目描述

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

 

测试用例

  • 功能测试(输入的字符串中有一个或者多个字符)
  • 特殊输入测试(输入的字符串的内容为空或者空指针)

 

题目考点

  • 考察应聘者的思维能力。
  • 考察应聘者对递归的理解和编程能力。

 

解题思路

通过将字符串分成两部分,从而把大问题分解成小问题,然后使用递归解决。

  1. 求所有可能出现在第一位置的字符,即把第一个字符和后面所有的字符交换。(记得为了下一次的交换,要把之前交换的东西交换回来)
  2. 固定第一个字符,求后面所有字符的排列。
  3. 这时候我们仍把后面的所有字符分成两个部分:后面字符的第一个字符,以及这个字符之后的所有字符。重复过程1,2。

 

自己解题

找到一个,回溯法(改日再来备注)

 

import java.util.List;
import java.util.Collections;
import java.util.ArrayList;
 
public class Solution {
    public static void main(String[] args) {
        Solution p = new Solution();
        System.out.println(p.Permutation("abc").toString());
    }
 
    public ArrayList Permutation(String str) {
        List res = new ArrayList<>();
        if (str != null && str.length() > 0) {
            PermutationHelper(str.toCharArray(), 0, res);
            Collections.sort(res);
        }
        return (ArrayList)res;
    }
 
    public void PermutationHelper(char[] cs, int i, List list) {
        if (i == cs.length - 1) {
            String val = String.valueOf(cs);
            if (!list.contains(val))
                list.add(val);
        } else {
            for (int j = i; j < cs.length; j++) {
                swap(cs, i, j);
                PermutationHelper(cs, i+1, list);
                swap(cs, i, j);
            }
        }
    }
 
    public void swap(char[] cs, int i, int j) {
        char temp = cs[i];
        cs[i] = cs[j];
        cs[j] = temp;
    }
}

 

 

参考解题

import java.util.ArrayList;
import java.util.TreeSet;

public class Solution {
    public ArrayList Permutation(String str) {
       ArrayList result = new ArrayList();
       if(str == null || str.length() == 0){
           return result;
       }
       char[] ca = str.toCharArray();
        
       TreeSet temp = new TreeSet<>();
        
       // 调用,这一部分没怎么看懂,addALL的作用是啥???
       PermutationCore(ca,0, temp);
       result.addAll(temp);        
       return result;
    }
    
    //------------- 功能函数--------------------
    void PermutationCore(char[] ca, int begin, TreeSet result){
        //
        if(begin == ca.length){
            //valueOf(char[] data)
            //返回 char数组参数的字符串 char形式。
            result.add(String.valueOf(ca));
        }else{
            for(int i = begin; i < ca.length; ++i){
                // 和后面一个字符交换位置
                swap(ca, i, begin);
                PermutationCore(ca, begin+1, result);
                // 换回来,为了下一次交换
                swap(ca, i, begin);
                }
            }
     }
    
    void  swap(char[] ca, int i, int j){
        char temp = ca[i];
        ca[i] = ca[j];
        ca[j] = temp;
    }
    
}

扩展

 

你可能感兴趣的:(面试算法题)