今天逛论坛,看到坛友提问:
(1)打印一个字符串的全字符组合情况,原始字符串中没有重复字符
(2)例如:原始字符串是"def", 打印得到下列所有组合情况:
"d" "e" "f" "de" "df" "ed" "ef" "fd" "fe" "def" "dfe" "edf" "efd" "fde" "fed"
尝试着用C做这道题,但纠结了半天没做出来,最后还是用OC做出来的
谁用C做过这道题吗?求看源码,用C怎么做?
以下是用OC做的源码和结果:
- //
- // main.m
- // OC输出所有组合
- // 题目:
- //(1)打印一个字符串的全字符组合情况,原始字符串中没有重复字符
- //(2)例如:原始字符串是"def", 打印得到下列所有组合情况:
- //"d" "e" "f" "de" "df" "ed" "ef" "fd" "fe" "def" "dfe" "edf" "efd" "fde" "fed"
- //------------------------------------------------------------------------------------
- // 思路分析:
- //(1)单个字符“d","e","f"
- // (2)取两个字符"de" "df" "ed" "ef" "fd" "fe"
- // (3)取三个字符"def" "dfe" "edf" "efd" "fde" "fed"
- // (4)由上面可分析得出,第3个字符组,是第1个与第2个互相组合得到的,依次类推,第4个字符组,是第1个与第3个互相组合得到
- // (5)所以用递归方法最好,可循环嵌套调用此方法
- //
- #import <Foundation/Foundation.h>
- //声明函数
- void groupDisplay(NSMutableArray *arr1,NSMutableArray *arr2,int loopTimes);
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- //定义一个字符数组,保存输入的英文字符
- char str1[100];
- //创建可变数组一,用于保存原数组拆分得到的字母,例如def拆分后"d","e","f"
- NSMutableArray *arr1=[NSMutableArray array];
- //创建可变数组二,用于保存组合,例如"de" "df" "ed" "ef" "fd" "fe"
- NSMutableArray *arr2=[NSMutableArray array];
- //提示输入
- NSLog(@"请输入字符串,字符串中不能有重复字母:");
-
- //例如死循环,如果输入的字符串有重复字母,则提示需要一直输入,直到输入无误
- while (YES) {
- //将输入的字符串保存到字符数组str1[100]中
- scanf("%s",str1);
- //创建Boolean变量用于保存状态,是否有重复字母,有重复字母赋值为NO
- BOOL flag=YES;
- //利用内外循环遍历字符数组中的,如果有任意两个重复,则flag赋值为NO,退出循环,且提示重新输入
- for (int i=0; i<strlen(str1); i++) {
- for (int j=i+1; j<strlen(str1); j++) {
- //如果有重复字母,则退出内循环,且提示重新输入
- if (str1[i]==str1[j]) {
- NSLog(@"输入的字符串中字母有重复,请重新输入:");
- flag=NO;
- break;
- }
- }
- //通过标志flag判断,如果有重复flag为NO,退出外循环
- if (flag==NO) {
- break;
- }
- }
- //通过标志flag判断,如果没有重复,flag标志为YES,退出while(YES)死循环,向下执行代码
- if (flag==YES) {
- break;
- }
- }
-
- //遍历str1字符数组,输出单个字母
- for (int i=0; i<strlen(str1); i++) {
- //将str1中的每个字母转变为字符串,并添加到可变数组arr1和arr2中
- NSString *temp=[NSString stringWithFormat:@"%c",str1[i]];
- [arr1 addObject:temp];
- [arr2 addObject:temp];
- }
-
- //逐个打印单个字母
- NSLog(@"%@",arr1);
-
- //定义变量loopTimes,如果loopTimes等于0,则函数结束调用
- int loopTimes=(int)[arr1 count]-1;
-
- //调用函数,将字母组合中的所有情况输出
- groupDisplay(arr1,arr2,loopTimes);
- }
- return 0;
- }
- //实现函数,函数传入数组arr1,数组arr2,和循环次数loopTimes,arr2中字符检测,如果不包含arr1中字符,则组合保存
- void groupDisplay(NSMutableArray *arr1,NSMutableArray *arr2,int loopTimes){
- //如果递归循环loopTimes为0,则结束递归,返回
- if (loopTimes==0) {
- return;
- }
- //定义一个可变数组,保存arr1和arr2字符组合
- NSMutableArray *mArrTemp=[NSMutableArray array];
-
- //外循环次数由传入的形参arr1长度控制
- for (int i=0; i<[arr1 count]; i++) {
- //内循环次数由传入的形参arr2长度控制
- for (int j=0; j<[arr2 count]; j++) {
- //定义可变字符串,用于临时拼接arr1和arr2的字符串
- NSMutableString *mStrTemp=[NSMutableString string];
- //循环检测arr2[j]中是否包含arr[i]
- NSRange rang=[arr2[j] rangeOfString:arr1[i]];
- //如果arr2[j]中不包含arr[i],则将两者拼接到mStrTemp可变字符串中,再将mStrTemp保存到数组mArrTemp中
- if (rang.location==NSNotFound) {
- [mStrTemp appendString:arr1[i]];
- [mStrTemp appendString:arr2[j]];
-
- [mArrTemp addObject:mStrTemp];
- }
- }
- }
- //递归次数减1;
- loopTimes--;
- //输出保存到可变数组mArrTemp中的字符串
- NSLog(@"%@",mArrTemp);
- //递归调用函数,如果loopTimes=0,则不会向下执行
- groupDisplay(arr1, mArrTemp,loopTimes);
- }
复制代码 输出结果截图:
|
-
结果.jpg
(29.73 KB, 下载次数: 21)
输出结果
|