数据结构-字符串的排列

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

分析:这个题目完全不会。根据标案分析发现一些细节需要注意,char* 和char[]的区别。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的.而char p[]是一个数组,已经分配内存,是将"abc123ABC" 复制到该内存里面,这个内存是可读写的

指针是不分配内存的,它指向的是系统的只读的内存,而数组是分配内存的,就是将系统的只读的内存里面的值复制到它的内存里面,因此可读写

char* p是定义的一个指针。。他指向的字符窜"abc123ABC" 是存在不可修改的区域(代码区)的。。
而char p[]是一个数组。。他的内容存在栈区可以修改

 char p[]="abc123ABC";

该条语句执行的是字符串数组的赋值操作是正确的
char *p="abc123ABC";
字符指针变量p指向字符串常量"abc123ABC"的首地址
字符串常量存放在数据区的“常量段”
所以当你访问并修改时会内存出错
正确的操作应该是:
char * p = (char * )malloc(10);
strcpy(p, "abc123ABC");

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

事实上数组和指针是有很大的区别的。

1.两者在含义上的区别。

  数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。

2.计算内存容量的区别。

  用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
剑指offer面试题28
*/
#include <iostream>

using namespace std;

void Sort(char* Str,char* begin){
    if(*begin == ''){
        cout << Str << " " << flush;
    }
    else{
        for(char* pCh=begin;*pCh!='';++pCh){


            char tmp = *pCh;
            *pCh = *begin;
            *begin = tmp;

            //swap(*pCh,*begin);
            Sort(Str,begin+1);
            //swap(*pCh,*begin);

            tmp = *pCh;
            *pCh = *begin;
            *begin = tmp;
        }
    }
}

void Sort(char* Str){
    if(Str == NULL){
        return;
    }

    Sort(Str,Str);
}

int main()
{
    char Str[] = "abc";

    Sort(Str);

    return 0;
}
原文地址:https://www.cnblogs.com/wn19910213/p/3749873.html