最近在網(wǎng)上看到這樣一個(gè)關(guān)于字符串的題目是這樣的 :
假設(shè)有一個(gè)字符串a(chǎn)abcad市埋,請(qǐng)寫一段程序捐韩,去掉字符串中不相鄰的重復(fù)字符串,即上述字符串處理之后的輸出結(jié)果為:aabcd
同時(shí)也給出了答案感耙,如下:
NSMutableString * str = [[NSMutableString alloc]initWithFormat:@"aabcad"];
for (int i = 0 ;i < str.length - 1 ;i++){
unsigned char a = [str characterAtIndex:i];
for (int j = i + 1 ;j < str.length ;j++){
unsigned char b = [str characterAtIndex:j];
if (a == b ){
if (j == i + 1){
}else{
[str deleteCharactersInRange:NSMakeRange(j, 1)];
}
}
}
}
NSLog(@"%@",str);
我感覺到這并不是我想要的答案就缆,也可能是誤解了出題者的意思,不管怎樣尤溜,我對(duì)題目的理解是這樣的倔叼,或許可以認(rèn)為是另一道題,不要笑??:
**假設(shè)有一個(gè)字符串a(chǎn)aaabbeffcfbfade宫莱,請(qǐng)寫一段程序丈攒,去掉字符串中不相鄰的重復(fù)字符串,即上述字符串處理之后的輸出結(jié)果為:aaaabbffcd
如果按照上面的方法計(jì)算得到的結(jié)果是 aaabbeffcd,是有差別的授霸。您看到這巡验,不妨先停下來,不要往下看來碘耳,免得被我的思路干擾显设,自己嘗試做一下,其實(shí)是很有趣的
弄了2辛辨、3個(gè)小時(shí)捕捂,終于寫出了一個(gè)方法瑟枫,感覺弄的有點(diǎn)復(fù)雜,還好弄出來了指攒,放上代碼????慷妙,如有錯(cuò)誤請(qǐng)指正,或者有簡單方便的方法允悦,歡迎指點(diǎn)膝擂;
- (NSString *)testWithStr:(NSString *)orignStr {
NSMutableString *str = [[NSMutableString alloc]initWithString:orignStr];
NSMutableArray *allStrArr = @[].mutableCopy;
NSMutableDictionary *allDic = @{}.mutableCopy;
for (int i = 0; i < str.length; i ++) {
NSString *eveyStr = [str substringWithRange:NSMakeRange(i, 1)];
[allStrArr addObject:eveyStr];
[allDic setObject:eveyStr forKey:@(i)];
}
NSMutableSet *strSet = [NSMutableSet setWithArray:allStrArr];
NSMutableIndexSet *indexset = [NSMutableIndexSet indexSet];
for (NSString *objStr in strSet) {
NSArray *sameValuKeyArr = [allDic allKeysForObject:objStr];
if (sameValuKeyArr.count > 1) {
for (NSNumber *keyNum in sameValuKeyArr) {
NSPredicate *predic = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF BETWEEN {%d, %d}",[keyNum intValue] - 1, [keyNum intValue] + 1]];
NSArray *aaArr = [sameValuKeyArr filteredArrayUsingPredicate:predic];
if (aaArr.count == 1) {
[indexset addIndex:[keyNum intValue]];
}
}
}
}
NSMutableString *lastStr = @"".mutableCopy;
[allStrArr removeObjectsAtIndexes:indexset];
for (int i = 0; i < allStrArr.count; i ++) {
[lastStr appendString:allStrArr[i]];
}
NSLog(@"---===test0011---%@",lastStr);
return lastStr;
}
說一下大概的思路:
1.把字符串每個(gè)字符取出放在一個(gè)數(shù)組中;同時(shí)把每個(gè)字符作為value 和其對(duì)應(yīng)的index作為可以放在一個(gè)字典中
2.把數(shù)組轉(zhuǎn)化成NSSet,去掉數(shù)組中重復(fù)的元素澡屡,減少在后面的循環(huán)次數(shù)
3.根據(jù)set里面的元素猿挚,取出字典中該元素對(duì)應(yīng)的key的集合(即字符串對(duì)應(yīng)的index)。如果集合里面只有一個(gè)值驶鹉,說明沒有重復(fù)绩蜻,不作處理;如果集合的值大于1室埋,則判讀每個(gè)key是否有相鄰的伙伴办绝,如果沒有,則說明是分開的姚淆,符合條件孕蝉,需要?jiǎng)h除,就把該key放在IndexSet中腌逢;
4降淮、原數(shù)組中刪除IndexSet對(duì)應(yīng)的value,然后重組字符串搏讶,就OK了
具體每一步分析如下:
- (NSString *)testWithStr:(NSString *)orignStr {
//例如 orignStr = @"aaaabbeffcfbfade";
NSMutableString *str = [[NSMutableString alloc]initWithString:orignStr];
NSMutableArray *allStrArr = @[].mutableCopy;//把字符串中每個(gè)字符分割成一個(gè)數(shù)組
NSMutableDictionary *allDic = @{}.mutableCopy;//把字符串中每個(gè)字符作為value佳鳖,index 做為key 放入一個(gè)字典中
for (int i = 0; i < str.length; i ++) {
NSString *eveyStr = [str substringWithRange:NSMakeRange(i, 1)];//取出每個(gè)字符
[allStrArr addObject:eveyStr];//生成完整的數(shù)組 @["a", "a", "a", "a","b", "b"......]
[allDic setObject:eveyStr forKey:@(i)];//生成完整的字典 @{@1 : a, @2 :a, @3 : a, @4 : a, @5 : b.........}
}
NSMutableSet *strSet = [NSMutableSet setWithArray:allStrArr];// NSMutableSet 把數(shù)組中重復(fù)的字符都去掉 這樣做在后面的操作中會(huì)減少循環(huán)次數(shù) ["a", "b", "c", "d", ”e", "f"]
NSMutableIndexSet *indexset = [NSMutableIndexSet indexSet];//準(zhǔn)備工作 最后數(shù)組中要?jiǎng)h除的字符的index
for (NSString *objStr in strSet) {
NSArray *sameValuKeyArr = [allDic allKeysForObject:objStr];//從字典中取出具有相同value的key值,并放入一個(gè)集合 (取出每個(gè)a對(duì)應(yīng)的key,每個(gè) b...)
if (sameValuKeyArr.count > 1) {//大于1表示 這個(gè)字符有重復(fù)的需要做后續(xù)篩選 等于1則表述整個(gè)字符串中只有這一個(gè)字符不做處理
for (NSNumber *keyNum in sameValuKeyArr) {//取出這些相同的字符 對(duì)應(yīng)的index
NSPredicate *predic = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF BETWEEN {%d, %d}",[keyNum intValue] - 1, [keyNum intValue] + 1]];//正則表達(dá)式 取出數(shù)組中當(dāng)前包括index在內(nèi)的3個(gè)數(shù)(不確定有沒有)
NSArray *aaArr = [sameValuKeyArr filteredArrayUsingPredicate:predic];
if (aaArr.count == 1) {//等于1則表示 該index 前后沒有相鄰的值, 是孤立的媒惕,符合條件 要被刪除 把該index 放入 要?jiǎng)h除的index集合中
[indexset addIndex:[keyNum intValue]];
}
}
}
}
//indexes: (6 10-13 15) 數(shù)組中 index 為6系吩,10~13,15 這6個(gè)元素去掉
NSMutableString *lastStr = @"".mutableCopy;
[allStrArr removeObjectsAtIndexes:indexset];//數(shù)組中刪除符合條件的元素
for (int i = 0; i < allStrArr.count; i ++) {
[lastStr appendString:allStrArr[i]];
}
NSLog(@"---===test0011---%@",lastStr);
return lastStr;
}
歡迎指正妒蔚!