CSDN每日一题求解

题目名称:影分身

时间限制: 1000ms 内存限制: 256M

通过率:20%

题目描述

已知字符串str。字符串str包含字符’x’,’y’。 如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。 xyyx - > yx ->

输入描述

输入多个字符。(1<=len<=1e5)

输出描述

输出最后的分身

示例
示例1

输入:

xyyyy

输出:

yyy
###python代码

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, str):
        result = []
        i=0
        while i < len(str):
            if i<len(str)-1 and str[i]!=str[i+1]:
                i+=2
            else:
                result.append(str[i])
                i+=1
        return ''.join(result)

if __name__ == "__main__":
    str = input().strip()
    sol = Solution()
    result = sol.solution(str)
    print(result)

通过率只有20%,想知道为啥?

【以下回答由 GPT 生成】

我会尽量帮助您优化代码以提高通过率。根据题目描述,您的解法是遍历字符串,如果相邻两个字符不同,则消除这两个字符。优化的关键是找到更高效的解法。以下是我针对您的代码给出的优化建议:

  1. 避免额外的空间开销。您的代码中使用了一个result列表来保存结果,然后再使用join函数来将列表转换为字符串。这里可以直接使用一个指针来记录结果字符串的末尾位置,并原地修改输入的字符串。

  2. 使用双指针法。通过维护两个指针来标记未消除的字符的起始位置和结束位置(初始值为0和1)。遍历字符串,当遇到相邻两个字符不同的情况时,将起始位置指针移动到结束位置的后一个位置,并更新结束位置指针为起始位置指针的下一个位置。这样可以通过一次遍历完成消除操作。

  3. 可以考虑使用一个计数器来记录连续相同字符的个数,减少判断的次数和增加效率。

下面是优化后的代码示例:

class Solution:
    def solution(self, s: str) -> str:
        n = len(s)
        ans = list(s)
        start = 0
        end = 1

        while end < n:
            if ans[start] != ans[end]:
                length = end - start
                if length >= 2:
                    ans[start+1:end] = [''] * (length-1)
                start = end
            end += 1

        return ''.join(ans).replace('', '')  # 移除空字符

if __name__ == "__main__":
    s = input().strip()
    sol = Solution()
    result = sol.solution(s)
    print(result)

这样的代码优化可以使通过率更高,但最终结果仍然可能受到测试用例的影响。如果通过率还不理想,可以考虑其他的解法或优化策略。希望对您有所帮助!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^