java 剑指offer之[数据结构 困难JZ38 字符串的排列

题目的链接在这里:https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7


题目大意

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

一、示意图

在这里插入图片描述

二、解题思路

DFS

DFS

代码如下:

import java.util.ArrayList;
public class Solution {
  public ArrayList<String> Permutation(String str) {
        //输入长度为n的字符串 打印他所有的排列组合
        ArrayList<String> arrayList=new ArrayList<>();
        if(str.length()==0)
            return arrayList;

        //感觉是需要用到dfs
        char[] chars = str.toCharArray();
        boolean isVisited[]=new boolean[chars.length];
        StringBuffer stringBuffer=new StringBuffer();
        int len=0;
        dfs(len,arrayList,chars,isVisited,stringBuffer);
        return arrayList;
    }

    private void dfs(int len, ArrayList<String> arrayList, char[] chars, boolean[] isVisited, StringBuffer stringBuffer) {
        //使用len进行判断
        if(len>=chars.length){
            //说明一次循环结束了
            //可以进行插入了 查重判断
              if(!arrayList.contains(new String(stringBuffer.toString()))) {
                arrayList.add(new String(stringBuffer.toString()));
            }
             //就可以跳出循环了
            return;
        }
        //不然的话 就进行访问 把他没有访问过的 都插入 然后修改成访问过的 然后在进行修改
        for(int i=0;i<isVisited.length;i++){
            if(!isVisited[i]){
                //说明他没有被访问过 那就修改他
                isVisited[i]=true;
                //然后len加一
                len++;
                //然后开始遍历 遍历结束就开始判断
                stringBuffer.append(chars[i]);
                dfs(len,arrayList,chars,isVisited,stringBuffer);
                //然后再还原
                 stringBuffer.deleteCharAt(stringBuffer.length()-1);
                isVisited[i]=false;
                  //这里需要修改吗
                len--;
            }
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值