黑马程序员技术交流社区

标题: 有什么方式可以最快找出2个字符串相同的元素,且找出的相同元素不重复 [打印本页]

作者: 起个名老说太长    时间: 2016-4-6 14:02
标题: 有什么方式可以最快找出2个字符串相同的元素,且找出的相同元素不重复
求大神解答
作者: mengjiechen    时间: 2016-4-7 13:12
  1. //  main.m
  2. //  找出两个字字符串的的相同部分
  3. //
  4. //  Created by Mengjiechen on 4/7/16.
  5. //  Copyright © 2016 Mengjiechen. All rights reserved.
  6. //有什么方式可以最快找出2个字符串相同的元素,且找出的相同元素不重复

  7. #import <Foundation/Foundation.h>

  8. int main(int argc, const char * argv[]) {
  9.     @autoreleasepool {
  10.         NSString *s1 = @"aabbccdef";
  11.         NSString *s2 = @"sad hellojsad";
  12.         NSMutableSet *arr1 = [NSMutableSet set];
  13.         NSMutableSet *arr2 = [NSMutableSet set];
  14.         //第一个字符串去掉重复
  15.         for (int i = 0; i < s1.length; i++) {
  16.             unichar c = [s1 characterAtIndex:i];
  17.             NSNumber *temp = [NSNumber numberWithChar:c];
  18.             [arr1 addObject:temp];
  19.             
  20.         }
  21.         //重新组成字符串
  22.         NSMutableString *mstr1 = [NSMutableString string];
  23.         for (NSNumber *d in arr1) {
  24.             unichar temp = [d charValue];
  25.             [mstr1 appendFormat:@"%c",temp];
  26.         }
  27.         
  28.         //第二个字符串去掉重复
  29.         for (int i = 0; i < s2.length; i++) {
  30.             unichar c = [s2 characterAtIndex:i];
  31.             NSNumber *temp = [NSNumber numberWithChar:c];
  32.             [arr2 addObject:temp];
  33.             
  34.         }
  35.         //重新组成字符串
  36.         NSMutableString *mstr2 = [NSMutableString string];
  37.         for (NSNumber *d in arr2) {
  38.             unichar temp = [d charValue];
  39.             [mstr2 appendFormat:@"%c",temp];
  40.         }
  41.         
  42.         NSLog(@"%@",mstr1);
  43.         printf("----------------------\n");
  44.         NSLog(@"%@",mstr2);
  45.         NSMutableString *result = [NSMutableString string];
  46.         //查找重复相同部分字符
  47.         [mstr1 enumerateSubstringsInRange:NSMakeRange(0, mstr1.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
  48.             NSRange temp = [mstr2 rangeOfString:substring];
  49.             if (temp.location != NSNotFound) {
  50.                 [result appendString:substring];
  51.             }
  52.         }];
  53.         
  54.         NSLog(@"%@",result);
  55.         
  56.     }
  57.     return 0;
  58. }
复制代码




运行结果:2016-04-07 13:09:09.261 找出两个字字符串的的相同部分[743:158657] beadcf
----------------------
2016-04-07 13:09:09.262 找出两个字字符串的的相同部分[743:158657] hdea sojl
2016-04-07 13:09:09.262 找出两个字字符串的的相同部分[743:158657] ead
Program ended with exit code: 0
作者: 起个名老说太长    时间: 2016-4-8 22:33
mengjiechen 发表于 2016-4-7 13:12
运行结果:2016-04-07 13:09:09.261 找出两个字字符串的的相同部分[743:158657] beadcf
-------------- ...

大神的答案很详细,谢谢了
作者: mengjiechen    时间: 2016-4-9 15:50
起个名老说太长 发表于 2016-4-8 22:33
大神的答案很详细,谢谢了

我把问题想复杂了,还有更简单的方法:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *s1 = @"aabbccdef";
        NSString *s2 = @"sad hellojsad";

        //方法二
        NSMutableSet *arr3 = [NSMutableSet set];
        
        [s1 enumerateSubstringsInRange:NSMakeRange(0, s1.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
            NSRange temp = [s2 rangeOfString:substring];
            if (temp.location != NSNotFound) {
                [arr3 addObject:substring];
            }
        }];
        
        NSLog(@"%@",arr3);

    }
    return 0;
}
作者: 起个名老说太长    时间: 2016-4-10 00:35
mengjiechen 发表于 2016-4-9 15:50
我把问题想复杂了,还有更简单的方法:
#import

你发的这部分有点没理解,能不能带上注释 比如substring 是什么东东

这是调用mstr1的字符串什么方法,然后遍历,找出相同的元素,那么它的底层是什么样的,相同的字符串是如何处理的,有资料吗??
[mstr1 enumerateSubstringsInRange:NSMakeRange(0, mstr1.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop){
            NSRange temp = [mstr2 rangeOfString:substring];
            if (temp.location != NSNotFound) {
                [result appendString:substring];
            }
        }];

这个对象方法就是专门用来比较2个字符串的相同字符的
作者: mengjiechen    时间: 2016-4-10 14:47
起个名老说太长 发表于 2016-4-10 00:35
你发的这部分有点没理解,能不能带上注释 比如substring 是什么东东

这是调用mstr1的字符串什么方法,然 ...

好好看看block,用法去看苹果的帮助手册




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2