有两个字符串,A和B,如果A字符串内部交换任意两个位置的字符就能够让A和B相等,就认为两个字符串是亲密字符串。
示例1
输入:A="cccb" ,B="cccb"
输出:True
解释: 任意两个c交换位置,都可以让A=B,他们是亲密字符串
示例2
输入:A="ccbcab", B="cccbab"
输出:True
解释:A内部交换A[2]和A[3]后,A=B,他们是亲密字符串
示例3
输入:A="ab", B="ab"
输出:False
解释:A字符串内部不论怎样交换,都不可能与B相同
如果A==B成立,那么就必须满足,A中有某个字符出现了两次或以上,只有这样,才能满足交换两个字符后与B相等,这是示例1的情况
如果A!=B,满足亲密字符串的条件就是A与B有两处不相同,而且交换这两处不相同的字符后A==B成立,这是示例2 的情况
如果A B两个字符串的长度不相等,必然不是亲密字符串。
遍历两个字符串,统计相同索引字符不相同的次数,如果次数是0,那么就必须满足A字符串有某个字符出现了两次或以上,可以用一个集合来保存A中的字符,如过有某个字符出现了两次或以上,那么最终,集合的大小一定小于A字符串的长度。
如果不相同的次数是2,那么交错对比这两处字符,如果不相同次数既不是0也不是2,则一定不是亲密字符串
# coding=utf-8
def is_close_str(str_1, str_2):
# 长度要一致,且不能为0
if len(str_1) != len(str_2) or len(str_1) < 2:
return False
index = 0
diff_index_lst = [] # 记录不一致的索引位置
char_set = set()
while index < len(str_1):
# 遇到相同位置字符不相同的情况
if str_1[index] != str_2[index]:
diff_index_lst.append(index)
if len(diff_index_lst) > 2:
return False
char_set.add(str_1[index])
index += 1
if len(diff_index_lst) == 0:
if len(str_1) != len(char_set):
return True
elif len(diff_index_lst) == 2:
diff_index_1 = diff_index_lst[0]
diff_index_2 = diff_index_lst[1]
# 两处不一样的地方交错比较
if str_1[diff_index_1] == str_2[diff_index_2] and \
str_1[diff_index_2] == str_2[diff_index_1]:
return True
return False
if __name__ == '__main__':
print(is_close_str("", ""))
print(is_close_str('abc', 'acba'))
print(is_close_str('ab', 'ab'))
print(is_close_str('cccb', 'cccb'))
print(is_close_str('ccbcab', 'cccbab'))
print(is_close_str('acbcad', 'dcbcaa'))
QQ交流群: 211426309