剑指offer 66题 -- 字符串的排列

class Solution {
public:
vector<string> Permutation(string str) {
    vector<string> result;
    if(str.size()<=0)
      return result;

    int start = 0;

    permute( str, start, result);

    sort( result.begin(), result.end() );

    return result;
  }

//采用传引用的方式,处理递归过程中的结果输出
  void permute( string str, int start, vector<string> &result)
  {

//采用递归方式处理字符串,将第一个字符和每个字符交换位置

//然后再处理每一个除了头字符的字符串, 就这样递归处理
    //当已经到了最后一个字符时候,需要将字符串填入vector,递归收尾
    if(start == str.size()-1)
    {
      result.push_back( str );
      return;
    }

    for(int j=start; j<str.size(); ++j)
    {
      if(j!=start && str[j]==str[start])
        continue;

      swap(str[start], str[j]);
                   //每次交换后,就开始处理子字符串
      permute(str, start+1, result);

      swap(str[start], str[j]);
    }
      return ;
  }
};

时间: 2024-11-05 13:49:46

剑指offer 66题 -- 字符串的排列的相关文章

剑指Offer对答如流系列 - 字符串的排列

面试题38:字符串的排列 题目描述 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 问题分析 把字符串分为两部分:一部分是第一个字符,另一部分是后面的所有字符. 首先,我们要确定第一个字符,该字符可以是字符串中的任意一个:其次固定第一个字符后,求出后面所有字符的排列. 实现第一个字符的改变,仅需将第一个字符和后面所有字符进行交换即可. 要记得字符串输出后要将字符变回原始的字符串

剑指offer 66题 -- 将一个字符串中的空格替换成“%20”

class Solution {public: void replaceSpace(char *str,int length) { //变量定义区 int newtv = 0; int oldtv = 0; int spaceNum = 0; //入参有效性判断 if( NULL == str || length <= 0) return; //计算空格数目 int i =0; while(str[i] != '\0') { oldtv++; if(str[i] == ' ') spaceNum

剑指Offer题目:字符串的排列

题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 题目分析: 最简单的是使用字典序生成法,这样可以把有重复字符串的情况也考虑进去. Java实现代码: import java.util.ArrayList; import java.util.Arrays; public class Solution { private ArrayList<String> r

剑指offer 66题 -- 连续子数组的最大和

class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { int maxNum =0x80000000; int curNum = 0; for(int i=0; i<array.size(); i++) { if(curNum <= 0) curNum = array[i]; else curNum += array[i]; if(curNum > maxNum) maxNum =

剑指offer 66题 -- 丑数

class Solution {public: int GetUglyNumber_Solution(int index) { //变量定义区 int subA=0, subB=0, subC=0; int sub =0; int* array = new int[index]; array[0] = 1; if(index <= 0) return 0; //分析:数组的后面的每一个元素必定是由数组前面的某一个乘以2,3,或者5得到 //  也就是说, 每个当前的值,都是由前面的某个值的2倍,

剑指 offer 第一题: 二维数组中的查找

打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣 ?? 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 图 1 如果没有头绪的话,很显然使用 暴力解法 是完全可以解决该问题的. 即遍历二维数组中的每一个元素,时间复杂度:O(n^2). 其实到这里我们就可以发现,使用这种暴力解法并没有充分利用题目给出的信息.这

剑指offer链表题的双指针法总结

本篇博客旨在总结双指针法在剑指offer链表题中的应用 包括删除链表中重复的节点.链表中倒数第k个节点.链表中环的入口节点.反转链表.合并两个排序的链表.两个链表的第一个公共节点. 根据双指针的类型,可以大致分为三种: 第一种是间隔一定距离的双指针法,包括删除链表中重复的节点.链表中倒数第k个节点两题 删除链表中重复的节点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5

剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). 1