zoukankan      html  css  js  c++  java
  • 剑指 Offer 38. 字符串的排列

     又是一个回溯法的题目,但难度更大了,很多地方容易出错

    主要是多了可能的重复

    二是字符数组和字符串的转换问题

    这题的核心在于交换,我们可以想象为

    确认第一位的值,就是将第1位和其他所有位做交换,做完交换后的后面的元素就是剩下的可选列表

    去重时则需要使用到HashSet

    “这个技巧应该之前的数字排列的回溯法题都能用”,比修改选择列表和路径/把路径弄成HashSet都要省时间

    class Solution {
        List<String> res=new LinkedList<>();//结果,先用集合框架存储
        public String[] permutation(String s) {
            char[] charArray=s.toCharArray();
            backtracking(charArray,0);
            return res.toArray(new String[res.size()]);
        }
    
        private void backtracking(char[] chars,int indexFrom)
        {
            //返回条件
            if(indexFrom==chars.length-1)
            {
                res.add(String.valueOf(chars));//字符数组转字符串
                return;
            }
    
    
            Set<Character> charSet=new HashSet<>();
            int length=chars.length;//是.length
            for(int i=indexFrom;i<length;i++)
            {
                // if(charSet.contains(char[])) 怎么去重?
                if(charSet.contains(chars[i]))
                {
                    continue;
                }
                charSet.add(chars[i]);
                swap(chars,indexFrom,i);
                backtracking(chars,indexFrom+1);//数组不会越界
                swap(chars,indexFrom,i);
            }
        }
    
        private void swap(char[] chars,int indexFrom,int indexTo)//交换指定位置字符
        {
            char temp=chars[indexFrom];
            chars[indexFrom]=chars[indexTo];
            chars[indexTo]=temp;
        }
    }

    注意字符数组和字符串的转换:

    char[] charSet={'a','b'};
    String str=String.valueOf(charSet);//字符数组转字符串
    
    String str1="sdfd";
    char[] charSet1=str1.toCharArray();//字符串转字符数组

    注意集合转数组

    return res.toArray(new String[res.size()])

    这样转成数组后才是有泛型的,如果是return res.toArray(); 则是一个Object类型的数组

  • 相关阅读:
    ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介
    $.ajax
    C#使用RabbitMQ
    WebAPI+NLog实现接口调用日志输出
    Spire.Doc组件读取与写入Word
    .net中RabbitMQ生产者/消费者
    第2课
    第1课
    详解usbmon抓取的log各字段的含义
    使用 usbmon 抓取 usb 总线上的数据
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14506719.html
Copyright © 2011-2022 走看看