还原原始字符串 | 豆包MarsCode AI刷题

96 阅读1分钟
def solution(str1):
    def can_generate(s, target):
        """检查字符串s是否能通过操作生成目标字符串target"""
        current = s
        used = {current}
        q = [current]
        
        while q and len(q[0]) <= len(target):
            current = q.pop(0)
            if current == target:
                return True
                
            # 尝试所有可能的K
            for k in range(len(current)):
                next_str = current + current[k:]
                if len(next_str) <= len(target) and next_str not in used:
                    if target.startswith(next_str):
                        used.add(next_str)
                        q.append(next_str)
        return False

    def get_all_prefixes(s):
        """获取字符串的所有可能前缀"""
        result = []
        for i in range(1, len(s) + 1):
            prefix = s[:i]
            if can_generate(prefix, s):
                result.append(prefix)
        return result

    # 获取所有可能的前缀
    possible_prefixes = get_all_prefixes(str1)
    
    # 如果没有找到可能的前缀,返回原字符串
    if not possible_prefixes:
        return str1
        
    # 返回最短的可能前缀
    return min(possible_prefixes, key=len)

if __name__ == "__main__":
    # 测试用例
    test_cases = [
        "abbabbbabb",  # "ab"
        "abbbabbbb",  # "ab"
        "jiabanbananananiabanbananananbananananiabanbananananbananananbananananbanananan",  # "jiaban"
        "selectecttectelectecttectcttectselectecttectelectecttectcttectectelectecttectcttectectcttectectcttectectcttect",  # "select"
        "discussssscussssiscussssscussssdiscussssscussssiscussssscussssiscussssscussss",  # "discus"
        "lflsdjlskjfl"  # "lflsdjlskjfl"
    ]
    
    expected_results = [
        "ab",
        "ab",
        "jiaban",
        "select",
        "discus",
        "lflsdjlskjfl"
    ]
    
    for i, test_case in enumerate(test_cases):
        result = solution(test_case)
        print(f"Test case {i + 1}: {result == expected_results[i]}")