字符串剔除不相邻的重复字符

 个人想把博客写的有营养一些,但有些力不从心,小生目前技术还没到位,所以,博客也就成了我的笔记本,写一些关于代码的心得。
 废话不多说,进入主题。
 今天,在看iOS相关的面试题,看到一道有点意思的小算法题。刚开始觉得这种简单问题,不值得一做,后来自己闲着没事就试着写了一段,结果,令我大跌眼镜。
 题目如下:
 假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
 首先,我讲述我一开始,看到这种题目思路吧!
 既然我们要去除字符串中重复的字符,我们首先要做的是:确定那些是字符是重复的(删除的字符的数量必须是两个以上的)。然后,我们再判断这些重复字符在字符串中的位置是否是相邻的。显然,这样做下来,是可以把问题解决的!
 思维障碍:一开始看这道题,想的特别多,万一字符串是aabcacd我先删除cc中间的a,然后cc相邻,那么cc不需要删。但是注意的是题目的本意并不是需要我们一步一步的去进行删除,并没有先后顺序,还是一开始字符串确定,我那些所谓分布的步骤是同时进行。
 先上代码再说:
    NSString *originStr = @"aabcacd";

    int i=0, j=0, count, flag=0;
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    for (i=0; i<originStr.length; i++)
    {
        count = 0;
        for (j=0; j<i; j++)
        {
            flag = 0;
            if ([originStr characterAtIndex:i] ==  [originStr characterAtIndex:j])
            {
                flag = 1;
                break;
            }
        }
        if (flag == 1)
            continue;
        for (j=i; j<originStr.length;j++)
        {
            if ([originStr characterAtIndex:i] ==  [originStr characterAtIndex:j])
            {
                count++;
            }
        }
        printf("%c字符的个数:%d\n",[originStr characterAtIndex:i],count);
        NSString *countStr = [NSString stringWithFormat:@"%d",count];
        NSString *characterStr = [NSString stringWithFormat:@"%c",[originStr characterAtIndex:i]];
        [dict setValue:countStr forKey:characterStr];
    }

上面的一段代码实现了查找字符串中所有的字符以及每个字符的个数。
运行结果如下
下面我们要将个数不为1的字符单独抽离出来

    NSMutableDictionary *newDict = [NSMutableDictionary dictionary];
    for (NSString *key in dict) {
        if ([dict[key] intValue] != 1) {
            [newDict setValue:dict[key] forKey:key];
        }
    }

重复出现的字符

在接下来,确定这些字符在字符串中位置:

  NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];

    for (NSString *key in newDict) {
        NSMutableArray *array = [NSMutableArray array];
        for (int i = 0; i<originStr.length; i++) {
            if ([[NSString stringWithFormat:@"%c",[originStr characterAtIndex:i]] isEqualToString:key] ) {
                [array addObject:[NSString stringWithFormat:@"%d",i]];
                [resultDict setValue:array forKey:key];

            }
        }



    }

重复字符的在字符串中的位置

接来下,我们需要判断相邻的位置是否相同的字符

        for (NSString *key in resultDict) {
                NSMutableArray *array = resultDict[key];
                for (int i = 0; i <array.count-1; i++) {
                    if ([array[i] intValue]+1 != [array[i+1] intValue]) {
                        NSUInteger number = (NSUInteger)[array[i+1] integerValue];
                        NSLog(@"number %lu",(unsigned long)number);
                        NSRange range = NSMakeRange(number, 1);
                        originStr = [originStr stringByReplacingCharactersInRange:range  withString:@" "];
                    }
                }

        }

   originStr = [originStr stringByReplacingOccurrencesOfString:@" " withString:@""];

提示:这里面存在一定的问题我们先将重复的字符串先替换成了(空格),然后将空格又装化成“”(空),如果题设中的字符串中间存在空格,那么这样的写法必然是存在问题的。那么会有同学问,为什么不直接替换成(空),首先你要删除的字符万一出现在字符串的最后一个位置,你置为空,那么程序是出错的。
运行的最终结果:aabcd.

另一种解法:

    NSString *originStr = @"aabcacd";
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < originStr.length; i++) {
        [array addObject:[originStr substringWithRange:NSMakeRange(i, 1)]];
    }


    for (int j = 0; j < array.count -1; j++) {
        NSLog(@"%lu",(unsigned long)array.count);
        for (int i = j; i <array.count - 3; i++) {
            if ([[array objectAtIndex:j] isEqualToString:[array objectAtIndex:i+2]]) {
                                [array replaceObjectAtIndex:i+2 withObject:@" "];
            }
        }
    }

代码运行最终的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中删除字符串中的所有相邻重复项,可以使用StringBuilder类来处理。 思路如下: 1. 创建一个StringBuilder对象,并将原始字符串添加到该对象中。 2. 遍历StringBuilder对象中的字符,从第一个字符开始。 3. 检查当前字符是否和下一个字符相同。如果相同,则删除当前字符和下一个字符。 4. 继续检查下一个字符,直到遍历完所有的字符。 5. 将StringBuilder对象转换为最终的字符串结果。 以下是一个示例代码实现: ```java public class Main { public static void main(String[] args) { String str = "aaabbbcccdddeee"; String result = removeAdjacentDuplicates(str); System.out.println(result); } public static String removeAdjacentDuplicates(String str) { StringBuilder sb = new StringBuilder(str); int index = 0; while (index < sb.length() - 1) { if (sb.charAt(index) == sb.charAt(index + 1)) { sb.delete(index, index + 2); } else { index++; } } return sb.toString(); } } ``` 在上述代码中,我们定义了一个`removeAdjacentDuplicates`方法,该方法接收一个字符串作为参数,并返回删除相邻重复项后的字符串。 通过遍历StringBuilder对象中的字符,我们可以检查当前字符是否和后一个字符相同,并根据情况删除字符或者继续检查下一个字符。最后,我们将StringBuilder对象转换为最终的字符串结果并返回。 在示例代码中,字符串"aaabbbcccdddeee"会被转换为"abcd"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值