给定两个字符串, 判断最少经过多少次swap 可以使得 两个字符串一致,

首先类似的问题 是存在一个 underlying graph 的。

每一个字母都对应着一个节点,两个字符串的不一致表示为图上的一条有向边

最后的问题转化为 图上的最(多)圆环分解

要注意的是贪心策略并不能解决问题(即每一次都选择 最小的那个圆环构成原图)

1

使用记忆化搜索策略。

将一个所有可能存在路径存在与否的向量作为相应的状态

超时的代码

class Solution:
def kSimilarity(self, A, B):
"""
:type A: str
:type B: str
:rtype: int
"""
if (A==B):
return 0 N = len(A)
alp ='abcdef' pairs = [(a,b) for a in alp for b in alp if a!=b]
# 所有可能的路径 index = {p:i for i,p in enumerate(pairs)}
# 所有可能的路径的编号 count = [0]*len(index)
#可能路径的数目(原图) 也就是初始状态 for a,b in zip(A,B):
if(a!=b):
count[index[(a,b)]]= count[index[a,b]]+ 1 seen = set()
#所有可能出现的环
for size in range(2,len(alp) + 1):
for cand in itertools.permutations(alp,size):
# 最小的哪一个出发节点为是顺序(防止重复)
i = cand.index(min(cand))
seen.add (cand[i:]+cand[:i]) possibles = [] #所有可能的环的路径表示 状态之间的 路径 for cand in seen:
row = [0] * len(alp)*(len(alp)-1)
for a,b in zip(cand,cand[1:]+cand[:1]):
row[index[a,b]]= row[index[a,b]]+1 possibles.append(row)
ZERO = tuple([0]*len(row))
memo = {ZERO:0} # print(possibles)
def solve(count):
if count in memo :
return memo[count]
ans =float('-inf')
#所有可能的路径
for row in possibles :
count2 = list(count)
for i,x in enumerate(row):
if count2[i]>=x :
count2[i] = count2[i] - x
else:
break
else:
ans = max(ans,1 + solve(tuple(count2)))
memo[count]= ans
return ans return sum(count)-solve(tuple(count))

2 暴力进行广度优先搜索

因为可以证明最优解可以是永远更换第一个不匹配的字母到合适的位置,那么我可以将一个节点的边数目由 N2 下降到N

而并不是所有意义上的交换 这种复杂度降低是非常有必要的

结论: 这种数据量比较小的问题往往比较复杂,尤其可能没有多项式解

class Solution:
def kSimilarity(self, A, B):
"""
:type A: str
:type B: str
:rtype: int
"""
def nei(S):
for i,c in enumerate(S):
if c!= B[i]:
break T=list(S)
for j in range(i+1,len(S)):
if(S[j]==B[i]):
T[i],T[j]= T[j],T[i]
yield "".join(T)
T[j],T[i]=T[i],T[j] queue= collections.deque([A])
seen ={A:0}
while(queue):
S=queue.popleft()
if(S==B):
return seen[S]
for T in nei(S):
if T not in seen:
seen[T]=seen[S]+1
queue.append(T)

这里有一个 fiield 迭代器的用发 可以学习一个

leetcode 854. K-Similar Strings的更多相关文章

  1. [LeetCode] 854. K-Similar Strings 相似度为K的字符串

    Strings A and B are K-similar (for some non-negative integer K) if we can swap the positions of two ...

  2. [链表]LeetCode 25 K组一个翻转链表

    LeetCode 25 k组一个翻转链表 TITLE 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3, ...

  3. 【LeetCode】1400. 构造 K 个回文字符串 Construct K Palindrome Strings

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计奇数字符出现次数 日期 题目地址:https:// ...

  4. Baozi Leetcode Solution 205: Isomorphic Strings

    Problem Statement Given two strings s and t, determine if they are isomorphic. Two strings are isomo ...

  5. [LeetCode] 555. Split Concatenated Strings 分割串联字符串

    Given a list of strings, you could concatenate these strings together into a loop, where for each st ...

  6. 【LeetCode】43. Multiply Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. [LeetCode] Remove K Digits 去掉K位数字

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  8. [LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  9. [LeetCode] Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

随机推荐

  1. 2019-3-16-win10-uwp-在-ItemsPanelTemplate-里面通过样式绑定-Orientation-显示方向

    title author date CreateTime categories win10 uwp 在 ItemsPanelTemplate 里面通过样式绑定 Orientation 显示方向 lin ...

  2. MapReduce1.0的缺陷

  3. HTML样式链接到外部样式表

    w3cschool链接:http://www.w3school.com.cn/html/html_css.asp <html> <head><link rel=" ...

  4. 数据库MySQL--分页查询

    应用场景:当显示的数据一页无法全部显示,则需要分页提交sql请求 语法: select 查询列表 from 表 {    (join type)join 表2 on 连接条件 where 筛选条件 g ...

  5. Android开发 SeekBar开发记录

    前言 开发记录博客不是讲解使用博客,更多的是各种功能与点子的记录 基本使用 <SeekBar android:layout_width="match_parent" andr ...

  6. css---6 选择器声明的优先级

    选择器的特殊性由选择器本身的组件确定,特殊性值表述为4个部分,如 0,0,0,0一个选择器的具体特殊性如下确定: 1.对于选择器中给定的ID属性值,加 0,1,0,0 2.对于选择器中给定的各个类属性 ...

  7. scala中Map集合的简单使用

    import scala.collection.mutable /** * Map集合的简单使用 */ object MapUse { def main(args: Array[String]): U ...

  8. Windows exit

    退出 CMD.EXE 程序(命令解释器)或当前批处理脚本. EXIT [/B] [exitCode] /B          指定要退出当前批处理脚本而不是 CMD.EXE.如果从一个         ...

  9. 命令学习_ping

    PING: ping是一个所有操作系统都支持的简单工具.我么可以利用ping来解析DNS 的A record和PTRrecord. A记录是将域名映射到IP地址,这个是ping的缺省功能, ping同 ...

  10. System.Web.Mvc.IActionFilter.cs

    ylbtech-System.Web.Mvc.IActionFilter.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Publ ...