38_剑指offer_java_字符串的排列

STK12与Python联合仿真(一):环境搭建 STK仿真python接口,安装与测试 阅读详情

目录

 

题目描述

测试用例

题目考点

解题思路

自己解题

参考解题

扩展


题目描述

输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串 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<String> Permutation(String str) {
        List<String> 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<String> 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<String> Permutation(String str) {
       ArrayList<String> result = new ArrayList<String>();
       if(str == null || str.length() == 0){
           return result;
       }
       char[] ca = str.toCharArray();
        
       TreeSet<String> temp = new TreeSet<>();
        
       // 调用,这一部分没怎么看懂,addALL的作用是啥???
       PermutationCore(ca,0, temp);
       result.addAll(temp);        
       return result;
    }
    
    //------------- 功能函数--------------------
    void PermutationCore(char[] ca, int begin, TreeSet<String> 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;
    }
    
}

扩展

 

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图 【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran's I,单变量莫兰指数,双变量莫兰指数计算,LISA聚类地图,显著性地图,Geoda双变量莫兰指数是一种强大的地理空间数据分析工具。 阅读详情

相关推荐

WS2812呼吸灯效果实战:用STM32的PWM+DMA实现流畅渐变(附完整代码)

本文详细介绍了如何使用STM32的PWM+DMA技术实现WS2812呼吸灯效果,提供完整的代码示例和调试技巧。通过PWM波形编码和DMA传输机制,解决了传统IO模拟控制方式的高CPU占用问题,实现了流畅的LED渐变效果,适用于各种嵌入式开发场景。

weixin_30566063的博客 452

剑指Offer系列38—字符串的排列

题意 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = “abc” 输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”] 限制: 1 <= s 的长度 <= 8 问题分析 深度优先搜索+回溯 代码 Java class Solution { List<String> res = new LinkedList<>(); char[] c;

fkuner的博客 456

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 365

剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列:回溯+交换元素

范大的博客 236

随机森林模型及案例(Python)

1 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。 集成学习模型的常见算法有Bagging算法和Boosting算法两种。 Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。 1.1 Bagging算法简介 Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投

qq_42433311的博客 4万+

Orcad 17.2导出PDF原理图终极指南:从Ghostscript安装到带属性书签配置

本文是Orcad 17.2导出高质量PDF原理图的终极指南。针对导出过程中常见的Ghostscript安装报错、软件卡死及版本兼容性问题,提供了详细的解决方案。重点推荐使用Ghostscript 9.53.3版本以确保最佳兼容性,并深入讲解了从安装配置、内存优化到高级书签属性设置的完整流程,帮助硬件工程师稳定、高效地生成带完整器件属性和导航书签的PDF文档。

weixin_29281915的博客 396

刷题笔记 | 剑指offer-JZ38(字符串的排列)

剑指offer-JZ38(字符串的排列)

qq_36291615的博客 554

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决 Xcode 13.2.1 运行到iOS12.x版本上崩溃报错如下:dyld: Symbol not found: ___chkstk_darwin dyld: Symbol not found: ___chkstk_darwin Referenced from: /private/var/containers/Bundle/Application/A424CEFD-51DB-450E-9D62-B8

wm9028的专栏 6563

【牛客 - 剑指offer】JZ38 字符串的排列 Java实现

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

guliguliguliguli的博客 702

CATIA CAA开发环境搭建避坑指南:从授权服务到VS配置全流程

本文提供了一份详尽的CATIA CAA开发环境搭建避坑指南,涵盖从授权服务(DSLS)安装、Visual Studio版本匹配与集成配置,到编译调试全流程。重点解析了授权服务无法连接、模块加载失败等典型问题的解决方案,强调版本严格对应与纯英文环境是成功搭建的关键。

redis7keeper的博客 572

java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 22】|泛化建模(上):领域知识更抽象怎么办?

java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 22】|泛化建模(上):领域知识更抽象怎么办?

大壮 1166

剑指offer面试题38(java版):字符串的排列

welcome to my blog 剑指offer面试题38(java版):字符串的排列 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 笔记 将char[]转成String不...

littlehaes的博客 589

【示波器专题】无源探头的常用附件

使用探头进行测试,我们不仅要知道探头的原理,还需要了解探头的常用附件及其使用方式,这样才能在尽可能在测试中提高效率且减少出错的概率

一点硬件 692

剑指offer第二版面试题38:字符串的排列(java)

题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印由字符a,b,c所能排列出来的所有字符串:abc,abc,bac,bca,cab,cba 分析: 我们求整个字符串的排列,可以看成两步:首先求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二步固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面...

许文杰的博客 1076

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LeetCode——剑指 Offer 38. 字符串的排列[中等]——分析及代码(Java)

LeetCode——剑指 Offer 38. 字符串的排列[中等]——分析及代码[Java]一、题目二、分析及代码1. 按字典序求解(1)思路(2)代码(3)结果三、其他 一、题目 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"] 限制: 1 <= s 的长度 <= 8 来源:力扣(LeetCode) 链接:http

江南土豆的博客 154

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

剑指offer—38.字符串的排列—分析及代码(Java)

剑指offer——38.字符串的排列——分析及代码[Java]一、题目二、分析及代码1. 回溯(1)思路(2)代码(3)结果三、其他 一、题目 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。 输入描述: 输入一个字符串,长度不超过 9 (可能有字符重复),字符只包括大小写字母。 二、分析及代码 1. 回溯 (1)思路 结合回溯方法,对所有可能的排列通过递归进

江南土豆的博客 275

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[剑指 Offer]38 字符串的排列 Java实现

道理我都懂, 可是用hashSet真的特别慢(x 题目 剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = “abc” 输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”] 限制: 1 <= s 的长度 <= 8 代码 class Solution { public String[] permutation(String s) { .

BedivereAlter的博客 293

剑指 Offer 38. 字符串的排列java题解

class Solution { List<String> res=new LinkedList<>(); char[] c; public String[] permutation(String s) { c=s.toCharArray();//String转char[] dfs(0); return res.toArray(new String[res.size()]);//List转String[]

乾坤未定,你我皆是黑马 358

剑指 Offer 38. 字符串的排列(java)

题目描述 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = “abc” 输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”] 限制: 1 <= s 的长度 <= 8 题解:回溯法 排序方案: 重复方案与剪枝: 递归解析: 终止条件: 当 x = len© - 1x=len©−1 时,代表所有位已固定(最后一位只有 11 种情况),则将当前组合 c 转化为字符串并加入 res,并返

m0_37605197的博客 381

【LeetCode - Java练习】剑指 Offer 38. 字符串的排列(中等)

文章目录1.题目描述2.解题思路3.代码实现 1.题目描述 2.解题思路 我们将这个问题看作有 n 个排列成一行的空位,我们需要从左往右依次填入题目给定的 n 个字符,每个字符只能使用一次。首先可以想到穷举的算法,即从左往右每一个空位都依次尝试填入一个字符,看是否能填完这 n 个空位,编程实现时,我们可以用「回溯法」来模拟这个过程。 定义递归函数 backtrack(i,perm) 表示当前排列为 perm,下一个待填入的空位是第 i 个空位(下标从 0 开始)。那么该递归函数分为两个情况: 如果 i=n

weixin_48683410的博客 571

Java详解剑指offer面试题38--字符串的排列

Java详解剑指offer面试题38–字符串的排列 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 注意这道题求得是全排列。求若干字符组成的序列的所有排列可能,可以将字符序列分解成两部分: 第一个字符 第一个字符之后的字符序列 这样就把一个大问题分解成了小问题,然后对小问题继续采用相同的策略即可! 因为所有字符都可能处于第一个位置,我们可以把第一个字符和其后的所有字符交换

快乐李同学的博客 782

剑指Offer 38.字符串的排列 回溯 Java

剑指Offer 38.字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列,不能重复 示例:输入 s = “abc” 输出 [“abc”, “acb”, “bac”, “bca”, “cab”, “cba”] import java.util.HashSet; import java.util.LinkedList; import java.util.List; class Solution { List<String> result = new LinkedList<

qq_45108095的博客 171

剑指 Offer 38. 字符串的排列java

输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = “abc” 输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”] 限制: 1 <= s 的长度 <= 8 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路

weixin_43824233的博客 191

剑指offer 38-字符串的排列-递归-回溯-java

题目: 思路: 递归 1。首先求出所有在第一个位置的字符 2.固定第一个字符,然后后面的字符排列 代码: import java.util.ArrayList; import java.util.List; import java.util.Collections; public class Solution { public ArrayList<String&g...

windyxue的博客 222

【Java】 剑指offer(38) 字符串的排列

本文参考自《剑指offer》一书,代码采用Java语言。 更多:《剑指Offer》Java实现合集 题目    输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。(本文代码采用ArrayList<String>接收返回的字符串,并要求不出现重复字符串) 思路 ...

weixin_30348519的博客 102

剑指 Offer 38. 字符串的排列(Medium)(JAVA)每日一题

剑指 Offer 38. 字符串的排列(Medium)(JAVA) 题目地址: https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/ 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"] 限制: 1 <= s 的长度 <= 8 解题方法 要找

qq_16927853的博客 583
上一篇: 37_剑指offer_java_反序列化二叉树
下一篇: 39_剑指offer_java_数组中出现次数超过数组长度一半的数字
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值