iOS關(guān)于“去掉字符串中不相鄰的重復(fù)字符串”的算法

最近在網(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;
}

歡迎指正妒蔚!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末穿挨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肴盏,更是在濱河造成了極大的恐慌科盛,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菜皂,死亡現(xiàn)場(chǎng)離奇詭異贞绵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幌墓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門但壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冀泻,“玉大人,你說我怎么就攤上這事蜡饵〉妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵溯祸,是天一觀的道長肢专。 經(jīng)常有香客問我,道長焦辅,這世上最難降的妖魔是什么博杖? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮筷登,結(jié)果婚禮上剃根,老公的妹妹穿的比我還像新娘。我一直安慰自己前方,他們只是感情好狈醉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惠险,像睡著了一般苗傅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上班巩,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天渣慕,我揣著相機(jī)與錄音,去河邊找鬼抱慌。 笑死逊桦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遥缕。 我是一名探鬼主播卫袒,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼宵呛,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼单匣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宝穗,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤户秤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逮矛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸡号,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年须鼎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲸伴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府蔗。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汞窗,靈堂內(nèi)的尸體忽然破棺而出姓赤,到底是詐尸還是另有隱情,我是刑警寧澤仲吏,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布不铆,位于F島的核電站,受9級(jí)特大地震影響裹唆,放射性物質(zhì)發(fā)生泄漏誓斥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一许帐、第九天 我趴在偏房一處隱蔽的房頂上張望劳坑。 院中可真熱鬧,春花似錦成畦、人聲如沸泡垃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔑穴。三九已至,卻和暖如春惧浴,著一層夾襖步出監(jiān)牢的瞬間存和,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工衷旅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捐腿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓柿顶,卻偏偏與公主長得像茄袖,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘁锯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法宪祥,類相關(guān)的語法,內(nèi)部類的語法家乘,繼承相關(guān)的語法蝗羊,異常的語法,線程的語...
    子非魚_t_閱讀 31,597評(píng)論 18 399
  • 有時(shí)候吃飯仁锯,就只是表達(dá)吃飯耀找。書中的角色恰似書外的人,當(dāng)然也會(huì)餓的业崖。而在多數(shù)情況下野芒,傳遞的意義卻不僅于此蓄愁。在書中,但...
    小進(jìn)叔閱讀 964評(píng)論 0 4
  • 2017.7.11 一狞悲、本期目標(biāo) 1.實(shí)現(xiàn)財(cái)富收入8月底之前一共收入50萬元現(xiàn)金涝登,不設(shè)上線 2.需要種下對(duì)應(yīng)種子 ...
    鵲曾閱讀 247評(píng)論 0 3
  • 兜里比較吃緊,所以買房的時(shí)候也糾結(jié)了挺久戚炫,最后選擇了這套比較靠近邊緣一些的86平兩居室房子剑刑。買房之后資金還是比較緊...
    家具必備閱讀 411評(píng)論 0 0
  • 我不知該如何命名今日的題目,因?yàn)榻裉爝^的實(shí)在很艱難双肤,無論是心情還是身體施掏,都處于一種疲倦和無望的焦灼里,幾分掙扎茅糜,幾...
    Jessy自由行走的貓閱讀 135評(píng)論 0 1