854. 相似度为 K 的字符串

2023-11-06

对于某些非负整数 k ,如果交换 s1 中两个字母的位置恰好 k 次,能够使结果字符串等于 s2 ,则认为字符串 s1 和 s2 的 相似度为 k 。

给你两个字母异位词 s1 和 s2 ,返回 s1 和 s2 的相似度 k 的最小值。

示例 1:

输入:s1 = "ab", s2 = "ba"
输出:1
示例 2:

输入:s1 = "abc", s2 = "bca"
输出:2
 

提示:

1 <= s1.length <= 20
s2.length == s1.length
s1 和 s2  只包含集合 {'a', 'b', 'c', 'd', 'e', 'f'} 中的小写字母
s2 是 s1 的一个字母异位词

先分析一下嗷,先遍历s1,判断s1[i]是否与s2[i]相等,如果相等,则判断下一个,

如果不相等,则遍历s2,直到找到一个相等的字符s2[j],然后swap(s2[i],s2[j]),次数加一

这样写看似没问题,

但是遇到s1=abacc,s2=cbaca的情况,

最优解是只需换一次的,而上述方法需要换两次。

怎么办呢?

用递归计算所有的情况呗!反正字符串不长!

class Solution {
    int minCount = INT_MAX;
public:
    int kSimilarity(string s1, string s2) {
        dfs(s1,s2,0,0);
        return minCount;
    }

    void dfs(string& s1,string& s2,int cur,int index){
        if(cur>=minCount)
        return;
        if(index==s1.length()){
            minCount=min(minCount,cur);
            return;
        }
        for(int i=index;i<s1.length();i++){
            if(s1[i]==s2[i]){
                dfs(s1,s2,cur,index+1);
            }else{
            for(int j=i+1;j<s1.length();j++){
                    if(s1[i]==s2[j]){
                        swap(s2[i],s2[j]);
                        dfs(s1,s2,cur+1,index+1);
                        swap(s2[i],s2[j]);
                    }
                }
            }
            return;
        }

    }
};

这样写是没问题的,数据量很小,只用了不到300ms。

但是,并不是非得一上来就dfs的,

存在这么一种情况:

先遍历s1,判断s1[i]是否与s2[i]相等,如果相等,则判断下一个,

如果不相等,则遍历s2,直到找到一个相等的字符s2[j],此时,再判断s2[i]与s1[j]是否相等,

如果相等,直接swap(s2[i],s2[j]),这样就是最优解,可以省去dfs的一些步骤,缩短时间。

代码如下:

class Solution {
    int minCount = INT_MAX;
public:
    int kSimilarity(string s1, string s2) {
        int ans=0;
        for(int i=0;i<s1.length();i++)
        {
            if(s2[i]==s1[i])
            continue;
            else
            {
                for(int j=i+1;j<s1.length();j++)
                {
                    if(s1[i]==s2[j]&&s1[j]==s2[i])
                    {
                        swap(s2[i],s2[j]);
                        ans++;
                        break;
                    }
                }
            }
        }
        dfs(s1,s2,0,0);
        return ans+minCount;
    }

    void dfs(string& s1,string& s2,int cur,int index){
        if(cur>=minCount)
        return;
        if(index==s1.length()){
            minCount=min(minCount,cur);
            return;
        }
        for(int i=index;i<s1.length();i++){
            if(s1[i]==s2[i]){
                dfs(s1,s2,cur,index+1);
            }else{
            for(int j=i+1;j<s1.length();j++){
                    if(s1[i]==s2[j]){
                        swap(s2[i],s2[j]);
                        dfs(s1,s2,cur+1,index+1);
                        swap(s2[i],s2[j]);
                    }
                }
            }
            return;
        }

    }
};

只用了24ms,啦啦啦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

854. 相似度为 K 的字符串 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 部署Oracle 19C RAC

    https www toutiao com i6879691817663595019 tt from weixin utm campaign client share wxshare count 1 timestamp 1602718612
  • 集成springSecurity遇到的跨域问题

    引言 该项目主要使用技术 sprinboot springSecurity vue 其它的技术就不介绍了 其中springSecurity是我参考网上的案例去进行的集成 虽然集成成功了 但是还不是太懂 下面就开始介绍一下我遇到的问题 问题重
  • Android开源框架之Fresco

    简介 Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库 可以从网络 本地存储和本地资源中加载图片 相对于ImageLoader 拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势 是个很好的图
  • 医学生可以跨专业考计算机的专业,可以跨考医学研究生:2016跨专业考研需谨慎的专业解读:临床医学...

    每年的跨专业考研人群有很大一批 或是因为本专业就业不景气 或是因为不感兴趣等等 诸多原因导致跨专业考研的人很多 跨专业考研的难度比一般要大 主要因为起点不同 往往此类考生专业课的基础都很低 从头开始 压力很大 因此在选专业的时候一定要谨慎
  • python怎么输出图片_Python怎么输出图片且不保存

    Python怎么输出图片且不保存 一 输出本地图片 使用open 函数来打开图片 使用show 函数来显示图片 from PIL import Image img Image open d dog png img show 这种图片显示方式
  • 基于BP神经网络的2014世界杯比分预测

    写在前头 科学的方法 娱乐的心态 研究背景 众所周知 今年的世界杯比赛各种坑爹 看了那么多砖家点评就没人说准过 当然足球比赛中有太多的未知变量 如何选择这些变量就成为了预测比赛比分的关键 本文作者另辟蹊径 选用足彩比分赔率作为影响比赛走势的
  • Java DAO代码重构(连接池方式)

    DAO设计简化思路 首先初始化数据库连接池 使用Alibaba的Druid连接池 需先下载druid 1 x x jar包 public class JDBCUtil private static DataSource ds null 初始
  • SQLServer数据库漏洞

    一 SQLServer数据库提权前提条件 1 以管理员身份运行数据库服务 2 已经获得SQL数据库的sysadmin权限 3 可以连接数据库 二 通过存储过程进行提权 hydra工具介绍 L 指定用户名字典 P 指定密码字典 vV 输出破解
  • 与孩子一起学编程python_与的解释

    子集上 一 与 康熙筆画 4 部外筆画 3 廣韻 集韻 正韻 同與 說文 賜予也 一勺爲与 六書正譌 寡則均 故从一勺 與 古文 廣韻 弋諸切 正韻 弋渚切 集韻 韻會 演女切 音予 說文 黨與也 戰國策 是君以合齊與强楚 註 與 黨與也
  • 《算法导论》笔记(18) 最大流 含部分习题

    流网络 容量值 源结点 汇点 容量限制 流量守恒 反平行 超级源结点 超级汇点 Ford Fulkerson方法 残存网络 增广路径 最小切割定理 f是最大流 残存网络不包含增广路径 f 等于最小切割容量三者等价 基本的Ford Fulke
  • Vijava 学习笔记之(获取用户自定义规范相关信息)

    源代码 package com vmware customzation import com vmware util Session import com vmware vim25 CustomizationSpecInfo import
  • [CVPR2020]Attention-Guided Hierarchical Structure Aggregation for Image Matting

    论文 Attention Guided Hierarchical Structure Aggregation for Image Matting 代码 wukaoliu CVPR2020 HAttMatting 基于注意力引导的层次结构聚集
  • mycat分库分表

    一 拆分原理 数据节点 分片 主机 ip port 数据库组合起来就是一个数据节点 分库 垂直拆分 不同的表分到不同的数据节点 分表 水平拆分 同一张表按照一定的规则拆分到不同的数据节点 二 mycat逻辑图 应用连接mycat mycat
  • 【编程之路】面试必刷TOP101:堆、栈、队列(42-49,Python实现)

    面试必刷TOP101 堆 栈 队列 42 49 Python实现 42 用两个栈实现队列 小试牛刀 step 1 push操作就正常push到第一个栈末尾 step 2 pop操作时 优先将第一个栈的元素弹出 并依次进入第二个栈中 step
  • 梦幻西游两个不同服务器的名字出现在跨服华山,系统会怎么处理,梦幻西游跨服决战华山玩法介绍...

    梦幻西游跨服决战华山新玩法已经出来了 很多的玩家还不知道该如何玩 下面我们一起来看详细的内容介绍 活动时间 没有帮派竞赛的周五 周日 进入活动场地时间 19 00 比赛时间 19 30 22 00 等级限制 等级 55级 分组机制 根据玩家
  • DLL,SDK,API专业技术术语

    SDK software development kit 中文可译为 软件开发工具包 一般都是一些被软件工程师用于为特定的软件包 软件架构 硬件平台 操作系统等建立应用软件的开发工具的集合 通俗点是指由第三方服务商提供的实现软件产品某项功能
  • 腾讯toB“联合舰队”的秘密

    14 天高强度谈判 每天都从早 8 点持续到凌晨 3 点 郭浩哲和他的同事们敲定了一笔融资 投资方是腾讯 投资金额达到了 12 66 亿元人民币 即使在腾讯的投资历史上 这都不是一个小数额 但实际流程仅用时一个多月 多少让郭浩哲对巨头的速度
  • Eclipse 安装C++环境

    安装CDT插件 方法一 选择 help 安装新的软件 然后点击Add 给定名称为 CDT 添加地址 http download eclipse org tools cdt releases juno 点击FInish 等待安装完成 提示重启
  • 第一课:初识Java语言

    第一课 初识Java语言 一 了解Java的历史由来 1 为什么学习Java编程语言 1 首先要了解编程语言的流行趋势 Tiobe PYPL排行榜 2 在这些排行榜上 Java语言的流行程度都名列前茅 在Tiobe排行榜上 甚至常年 排名第
  • 854. 相似度为 K 的字符串

    对于某些非负整数 k 如果交换 s1 中两个字母的位置恰好 k 次 能够使结果字符串等于 s2 则认为字符串 s1 和 s2 的 相似度为 k 给你两个字母异位词 s1 和 s2 返回 s1 和 s2 的相似度 k 的最小值 示例 1 输入