给定一个字符串和一个数字,这个函数将产生该字符串中n个字母的所有可能组合。
即。如果我传递“abcd”和3,那么我应该得到以下输出:
abc
abd
acd
bcd
这是代码
- (void)viewDidLoad {
[super viewDidLoad];
[self expand_combinations:@"abcd" arg2:@"" arg3:3];
}
-(void) expand_combinations: (NSString *) remaining_string arg2:(NSString *)s arg3:(int) remain_depth
{
if(remain_depth==0)
{
printf("%s\n",[s UTF8String]);
return;
}
for(int k=0; k < [remaining_string length]; ++k)
{
s = [s stringByAppendingString:[[remaining_string substringFromIndex:k] substringToIndex:1]];
[self expand_combinations:[remaining_string substringFromIndex:k+1] arg2:s arg3:remain_depth - 1];
}
return;
}
相反,这就是打印出来的
abc
abcd
abcd
abcd
答案 0 :(得分:1)
您的功能只是一个快速而肮脏的解决方案(没有重命名变量名等等)
-(void) expand_combinations: (NSString *) remaining_string arg2:(NSString *)s arg3:(int) remain_depth
{
NSString *newString = [remaining_string stringByReplacingCharactersInRange:NSMakeRange(remain_depth, 1) withString:@""];
// NSLog(newString);
if(remain_depth==0)
{
printf("%s\n",[s UTF8String]);
return;
}
[self expand_combinations:remaining_string arg2:s arg3:remain_depth - 1];
return;
}
输出(我使用的是NSLog)
2010-09-26 04:27:26.462 Untitled[5417:207] abc
2010-09-26 04:27:26.462 Untitled[5417:207] abd
2010-09-26 04:27:26.463 Untitled[5417:207] acd
2010-09-26 04:27:26.467 Untitled[5417:207] bcd
答案 1 :(得分:-2)
我找到了解决方案。在这里。
- (void)viewDidLoad {
[super viewDidLoad];
[self expand_combinations:@"abcd" arg2:@"" arg3:3];
}
-(void) expand_combinations: (NSString *) remaining_string arg2:(NSString *)s arg3:(int) remain_depth
{
if(remain_depth==0)
{
printf("%s\n",[s UTF8String]);
return;
}
NSString *str = [[NSString alloc] initWithString:s];
for(int k=0; k < [remaining_string length]; ++k)
{
str = [s stringByAppendingString:[[remaining_string substringFromIndex:k] substringToIndex:1]];
[self expand_combinations:[remaining_string substringFromIndex:k+1] arg2:str arg3:remain_depth - 1];
}
return;
}
我为使其发挥作用所做的更改在
行中NSString *str = [[NSString alloc] initWithString:s];
从那里我用str替换s的每个实例。似乎通过使用s而不是str,一些重要的值被覆盖,这导致问题无法正常工作。有必要创建另一个NSString变量str,以便s的内容不会被覆盖。