You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确删除成对相同字符缩短字符串?C#代码问题求助

问题分析与修复方案

你的代码存在三个核心问题,导致首尾相同字符无法删除、测试用例未生效:

问题点拆解

  1. 测试用例未正确加载:硬编码data = "helloworld",导致所有测试用例都只处理这个固定字符串,其他注释的测试用例根本没运行。
  2. 外层循环逻辑冲突:使用for循环时,即便删除字符后重置i=0,for循环的i++仍会让下一次循环的i变成1,无法从头重新检查整个字符串,遗漏新出现的首尾相同对。
  3. 索引删除顺序错误:先删除靠前的i位置字符,会导致后面di位置的索引偏移,可能删错目标字符。

修复后的代码

string[] testdata = { 
    "helloworld", 
    "aaa", 
    "abaccbaabbaabcc", 
    "pepperonipizza", 
    "thequickbrownfoxjumpedoverthelazydog" 
};

foreach (string test in testdata)
{
    string data = test; // 每次处理当前测试用例,重置data
    int i = 0;
    while (i < data.Length)
    {
        bool foundPair = false;
        // 从末尾往前找第一个和当前i位置相同的字符(必须在i右侧)
        for (int di = data.Length - 1; di > i; di--)
        {
            if (data[i] == data[di])
            {
                // 先删右侧字符,避免左侧删除后索引偏移
                data = data.Remove(di, 1);
                data = data.Remove(i, 1);
                foundPair = true;
                break;
            }
        }
        // 找到配对就从头检查,没找到就移动到下一个字符
        i = foundPair ? 0 : i + 1;
    }
    Console.WriteLine($"输入: {test} → 输出: {data}");
}

关键修改说明

  • 绑定测试用例:将data赋值为当前循环的test变量,确保每个测试用例都被正确处理。
  • 改用while循环控制检查流程:通过foundPair标志判断是否需要从头重新检查,避免for循环自动递增导致的逻辑漏洞。
  • 调整删除顺序:先删除右侧的di位置字符,再删除左侧的i位置,保证索引不会因为提前删除左侧字符而偏移。
  • 优化内层循环条件:用di > i替代di != i,避免检查同一个位置的字符,减少无效判断。

测试结果验证

  • 输入pepperonipizza → 输出rona(符合预期)
  • 输入thequickbrownfoxjumpedoverthelazydog → 输出qickbwnfxjmpvlazyg(符合预期)
  • 输入helloworld → 输出helwrd(符合预期)
  • 输入aaa → 输出a(只剩单个字符,无配对可删)

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:15:00