剑指offer-27-字符串的排列

字符串的排列_牛客网

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=13&tqId=11180&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

没想到按照自己的思路又攻克下了一道题目,在这道题目书写的过程中又进一步复习了java中String以及StringBuilder的用法
总体的解决思路是:
假设输入为a、b、c
那么其实排序的总数:
fun(a,b,c)=a(fun(b,c))+ a和b交换(fun(a,c))+a和c交换(fun(b,a))
fun(b,c) = b+fun(c)+b和c交换(fun(b))
fun(c)=1
所以用递归的方法就可以了,并且在这个递归的过程中,并没有做出一些浪费运行时间的事情,每一个递归都会产生新的结果,因此用递归来解决被称为动态规划的此题,是合理的。
另外题目中说明可能存在重复的字符,因此在进行交换的时候需要判断进行交换的字符是否相等,如果相等就没有必要交换了。

import java.util.ArrayList;
public class Solution {

    public ArrayList<String> PermutationHelp(StringBuilder str){
         ArrayList<String> result = new  ArrayList<String>();
        if(str.length() == 1)result.add(str.toString());
        else{
            for(int i = 0; i < str.length(); i++){
                if(i== 0  || str.charAt(i) != str.charAt(0)){
                    char temp = str.charAt(i);
                    str.setCharAt(i, str.charAt(0));
                    str.setCharAt(0, temp);
       

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白刷剑指offer 文章被收录于专栏

跟着小白一起刷剑指offer,通过讨论加深印象吧~ 没有人不学习就能够掌握知识,知识就是需要学习的~

全部评论
利用TreeSet存储结果更方便,不仅排除了重复的情况,还可以做到排序
6
送花
回复
分享
发布于 2019-10-25 20:36
感觉那个放回操作有点多余,删了那个放回操作就能通过了,真神奇
2
送花
回复
分享
发布于 2020-03-19 00:02
网易互娱
校招火热招聘中
官网直投
这个代码有问题,没有排序输出有误
1
送花
回复
分享
发布于 2020-02-17 20:07
赞,代码是对的 排序那加上Collections.sort(result);即可,同时要记得导包import java.util.Collections; 主要是 result.add(str.substring(0,1)+newResult.get(j));这地方我有点困惑,为啥每次都要加上首字符
1
送花
回复
分享
发布于 2020-03-05 12:20
代码好像有问题:比如对于字符串 ABCB,就会出现多个重复结果。
1
送花
回复
分享
发布于 2020-10-28 12:13
代码有问题,输入"abb"就会发现有错。
2
送花
回复
分享
发布于 2019-11-14 17:00
感觉这个姐姐超爱用递归,哈哈
点赞
送花
回复
分享
发布于 2020-01-23 20:02
这题居然要求输出排序,而且题目也不说明,太坑了
点赞
送花
回复
分享
发布于 2020-02-19 12:38
1、排序操作放在Permutation函数return result; 之前就可以了,避免总是排序; 2、//用完还是要放回去的 temp = str.charAt(0); str.setCharAt(0, str.charAt(i)); str.setCharAt(i, temp); 模拟了一下递归发现不放回也是可以的,经过help函数每一个位置的数在第一位只可能出现一次
点赞
送花
回复
分享
发布于 2020-03-16 10:22
谢谢,写太好了
点赞
送花
回复
分享
发布于 2020-03-28 16:34
源代码通过率只有50%啊浮沉
点赞
送花
回复
分享
发布于 2020-04-03 22:54
可以转为char[]
点赞
送花
回复
分享
发布于 2020-07-18 09:09
感觉自己好菜啊。加油
点赞
送花
回复
分享
发布于 2020-07-30 22:05
最开始应该对给定字符串进行排序的preprocessing,注意不要删除重复的,比如给bbaaced,处理完之后aabbcde,然后使用递归的结果产生的所有结果应该就是按字典顺序了,还有最后的结果需要去重
点赞
送花
回复
分享
发布于 2020-07-31 15:56
-0-k神的粉丝吧
点赞
送花
回复
分享
发布于 2020-11-30 16:52
排序操作用Collections.sort就行
点赞
送花
回复
分享
发布于 2021-01-13 22:56
排序用sort就行,重复加一句contains判断就可以了
点赞
送花
回复
分享
发布于 2021-05-02 20:11
代码有问题
点赞
送花
回复
分享
发布于 2021-05-10 12:07

相关推荐

129 5 评论
分享
牛客网
牛客企业服务