实现反转嵌套括号内字符的函数及C#代码问题排查
括号内字符串反转函数的代码问题排查
需求:编写一个函数,反转输入字符串中括号(支持嵌套)内的字符,输入字符串的括号始终格式正确、匹配。
示例:
- 当输入
"(bar)",函数返回"rab" - 当输入
"foo(bar)baz",函数返回"foorabbaz" - 当输入
"foo(bar)baz(blim)",函数返回"foorabbazmilb" - 当输入
"foo(bar(baz))blim",函数返回"foobazrabblim"(处理逻辑是先转为"foo(barzab)blim",再得到最终结果)
我编写了如下C#代码,但运行后始终返回原输入字符串,明明用了String.Replace却没有生效,请求排查原因:
string solution(string inputString) { int first, last; string word; while (true) { if (inputString.Contains("()")) { first = inputString.LastIndexOf("("); last = inputString.IndexOf(")"); word = inputString.Substring(first+1, last-first-1); inputString.Replace(inputString.Substring(first, last-first), backwardinator(word)); } else { break; } } return inputString; } string backwardinator(string word) { string newWord = ""; for (int i = word.Length - 1; i >= 0; i--) { newWord += word[i]; } return newWord; }
问题排查与修复
1. String.Replace未生效的核心原因
C#中的字符串是不可变类型,Replace方法不会直接修改原字符串,而是返回一个包含替换结果的新字符串。你需要将替换后的结果重新赋值给inputString,否则原字符串不会有任何变化。
2. 循环条件错误
你用inputString.Contains("()")作为循环判断条件,但只有当字符串中存在空括号时才会进入循环,这完全不符合需求——我们需要处理所有存在括号对的情况,不管括号内是否有内容。正确的循环条件应该是判断字符串中是否还有左括号:while (inputString.Contains("("))。
3. 括号匹配逻辑错误
- 你用
LastIndexOf("(")找到最后一个左括号后,用IndexOf(")")找的是整个字符串的第一个右括号,这会导致嵌套括号时匹配错误(比如foo(bar(baz))blim中,最后一个左括号对应的右括号是它后面的第一个右括号,而不是字符串开头的右括号)。正确的做法是从找到的左括号位置开始寻找对应的右括号:last = inputString.IndexOf(")", first)。 Substring的长度参数错误:inputString.Substring(first, last-first)只取了从左括号到右括号前一位的内容,漏掉了右括号本身。正确的长度应该是last - first + 1(包含左右两个括号)。
修正后的代码
string solution(string inputString) { int first, last; string word; // 修改循环条件:只要还有左括号就继续处理 while (inputString.Contains("(")) { first = inputString.LastIndexOf("("); // 从左括号位置开始找对应的右括号 last = inputString.IndexOf(")", first); word = inputString.Substring(first + 1, last - first - 1); // 将Replace的结果重新赋值给inputString inputString = inputString.Replace(inputString.Substring(first, last - first + 1), backwardinator(word)); } return inputString; } string backwardinator(string word) { // 用数组反转更高效,替代逐个字符拼接 char[] charArray = word.ToCharArray(); Array.Reverse(charArray); return new string(charArray); }
内容的提问来源于stack exchange,提问作者pmelan
相关产品推荐
相关产品推荐

