Why doesn't this code produce the correct output? [closed]
Given a string and a number, this function will produce all possible combinations of n letters from that string.
i.e. If I pass "abcd" and 3, then I should get the following output:
abc
abd
acd
bcd
This is the code
- (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;
}
Instead this is what it prints out
abc
abcd
abcd
abcd
Just a quick and dirty solution (didn't rename variable names and so on) for your function
-(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;
}
Output (I used 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
I found the solution. Here it is.
- (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;
}
The changes I made to make it work are in the line
NSString *str = [[NSString alloc] initWithString:s];
From there I replace every instance of s with str. It seems that by using s instead of str, some important value was getting overwritten which was causing the problem to not work correctly. It is necessary to create another NSString variable str so that the contents of s do not get overwritten.
精彩评论