VK
BAN USER-(NSArray*)matchTree:(NSArray*)words pattern:(NSString*)pattern
{
NSMutableDictionary* tree = [NSMutableDictionary new];
for(NSString* word in words)
{
NSMutableDictionary* parent = tree;
for(int i = 0; i < [word length]; i++)
{
NSString* token = [word substringWithRange:NSMakeRange(i, 1)];
if(!parent[token])
parent[token] = [NSMutableDictionary new];
parent = parent[token];
}
parent[@""] = [NSMutableDictionary new]; // mark the end of the word
}
return [self findPattern:tree soFar:@"" pattern:pattern];
}
-(NSArray*)findPattern:(NSDictionary*)tree soFar:(NSString*)soFar pattern:(NSString*)pattern
{
if([soFar length] == [pattern length])
{
if(tree[@""])
return @[soFar];
else
return @[];
}
NSString* token = [pattern substringWithRange:NSMakeRange([soFar length], 1)];
if(tree[token])
return [self findPattern:tree[token] soFar:[soFar stringByAppendingString:token] pattern:pattern];
else if([token isEqualToString:@"."])
{
NSMutableArray* combined = [NSMutableArray new];
for (NSString* key in [tree allKeys])
[combined addObjectsFromArray:
[self findPattern:tree[key] soFar:[soFar stringByAppendingString:key] pattern:pattern]];
return combined;
}
else
return @[];
}
-(NSString*)lookAndSay:(NSInteger)num
{
NSArray* arr = @[@1];
for (int i = 0; i < num; i++)
{
arr = [self lookAndSayForArray:arr];
}
return [arr componentsJoinedByString:@""];
}
-(NSArray*)lookAndSayForArray:(NSArray*)arr
{
NSMutableArray* resultArr = [NSMutableArray new];
NSInteger currentCount = 1;
for (int i = 0; i < [arr count]; i++)
{
if(i == [arr count] - 1 || ![arr[i] isEqualToNumber:arr[i+1]])
{
[resultArr addObject:@(currentCount)];
[resultArr addObject:arr[i]];
currentCount = 1;
}
else
{
currentCount++;
}
}
return resultArr;
}
- VK December 03, 2014