如何正确删除成对相同字符缩短字符串?C#代码问题求助
问题分析与修复方案
你的代码存在三个核心问题,导致首尾相同字符无法删除、测试用例未生效:
问题点拆解
- 测试用例未正确加载:硬编码
data = "helloworld",导致所有测试用例都只处理这个固定字符串,其他注释的测试用例根本没运行。 - 外层循环逻辑冲突:使用
for循环时,即便删除字符后重置i=0,for循环的i++仍会让下一次循环的i变成1,无法从头重新检查整个字符串,遗漏新出现的首尾相同对。 - 索引删除顺序错误:先删除靠前的
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
相关产品推荐
相关产品推荐

