首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Objective-C 移除字串中相鄰重複字符的正確演算法實作

     編輯:程式設計綜合問答

原始錯誤碼

NSMutableString *string = [NSMutableString stringWithFormat:@"aabbssddffiieeoo"];
for (NSInteger i = 0; i <= [string length]; i++) {
    NSString *strIndex1 = [string substringWithRange:NSMakeRange(i, 1)];
    NSString *strIndex2 = [string substringWithRange:NSMakeRange(i + 1, 1)];
    if ([strIndex1 isEqualTo:strIndex2]) {
        [string deleteCharactersInRange:NSMakeRange(i + 1, 1)];
    }
}
// 問題:刪除後索引未調整,導致漏檢或越界

問題分析

  • 正向遍歷時刪除字符會導致後續字符前移,原索引 i+1 變為新字符,但迴圈仍遞增 i,造成跳過檢查。
  • i <= length 在刪除後 length 變小,易發生越界。

正確實作(雙層迴圈 + 索引遞減)

NSMutableString *string = [NSMutableString stringWithFormat:@"aabbbssddffffiieeoo"];

for (NSInteger i = 0; i < string.length - 1; i++) {
    for (NSInteger j = i + 1; j < string.length; j++) {
        NSString *str1 = [string substringWithRange:NSMakeRange(i, 1)];
        NSString *str2 = [string substringWithRange:NSMakeRange(j, 1)];
        if ([str1 isEqualToString:str2]) {
            [string deleteCharactersInRange:NSMakeRange(j, 1)];
            j--; // 刪除後當前位置換新字符,需重新比較
        } else {
            break; // 遇到不同字符,結束內層迴圈,外層進入下一組
        }
    }
}
NSLog(@"%@", string); // 輸出: abdfio

關鍵點

  1. 外層 i 定位「當前基準字符」。
  2. 內層 j 向後掃描相同字符並刪除。
  3. 刪除後 j-- 確保新移入位置的字符也被比較。
  4. break 優化:一旦遇到不同字符,後續必不相同(因只刪除相鄰重複),直接跳出內層。

替代方案:正則表達式

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(.)\\1+" options:0 error:nil];
NSString *result = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, string.length) withTemplate:@"$1"];
// 結果同樣保留每組相鄰重複字符的第一個

效能提示

短字串雙層迴圈足夠;長字串(>10k 字符)建議用正則或單次遍歷構建新字串(O(n))。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved