最少操作次数(英雄会)
作者博客链接
题目详情:
给定两个字符串,仅由小写字母组成,它们包含了相同字符。
求把第一个字符串变成第二个字符串的最小操作次数,且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头。
例如给定两个字符串“abcd" "bcad" ,输出:2,因为需要操作2次才能把"abcd"变成“bcad" ,方法是:abcd->cabd->bcad。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
由于算法基础薄弱,题做出来了,却不知道自己用的是什么算法,等后面有时间了一定得好好补下。
我的做法是:如果能找到 不移动 " 不必要移动的字符" 并且 "必须要移动的字符“ 只移动一次的的方法,那么这种方法的操作次数必然是最少的。
其中不必要移动字符是指 通过移动其他的字符而能使自己达到目的字符串中的位置,而必须要移动的字符恰恰相反;
现在需要做的是找出这两种字符,然后看能否找到"必须要移动的字符“ 只移动一次的方法;
看下面的例子,由上面的字符串 A 转换为下面的字符串 B :
根据结果B中的字符位置的限定,我们来找出A中哪些字符是不必要移动,而另外一些无论如何都是需要被移走的,显然x、y、z是没必要移动(比如y可以通过移走e、f、g达到B中的正确位置),而g,f,e,d,c,b,a这7个字符是必须要移走的(因为如果f不被移走的话,那么z不可能成为最后一个字符,所以f是必须要移走的)。同时发现不必要移动的字符是目的字符串B中某个末尾子串,并且这个子串中的字符在A中的先后顺序与B中的顺序一致。
然后需要考虑的是有没有上述理想的移动方法呢?答案是有的,如下:
按B中除去末尾不必要移动的字符的子串的逆序来移动A中必要移动的元素,正好可以将A转换为B。
可以认为移动分为两步,删除所有必须移动的元素,再按合理顺序插入这些字符,即可以认为是将这些必要移动的字符先放在另外的串C,然后将这些字符按合理的顺序插入到xyz前面。自己可以动手画下上面的例子,依次移动g,f,e,d,c,b,a到开头即能将A转换为B。
由于题目只要求求最少的操作次数,那么我们只需统计需要被移走的字符个数即可,代码如下:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class Test {
public: static int getNumber (string a,string b){ int i=a.size()-1,j=i,cnt=0;
for(;i>=0;i--){
if(a[i]!=b[j]) cnt++;
else j--;
}
return cnt; }
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{ cout<<Test::getNumber("abxcdyezfg", "abcdefgxyz")<<endl;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加
最少操作次数(英雄会)相关推荐
- Leetcode1713. 得到子序列的最少操作次数[C++题解]:LCS转化成LIS,转化为nlogn做法
文章目录 本题分析 题目链接 本题分析 本题难在问题转换上. [问题转化1]转化为求两个序列最长公共子序列(LCS)的长度. 然后target 的长度减去 公共子序列的长度,就是答案. 本题数据规模是 ...
- leedcode04:转换字符串的最少操作次数
一:题目 给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O' . 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 'O' .注意,如果字符已经是 ...
- 2027. 转换字符串的最少操作次数
2027. 转换字符串的最少操作次数 给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O' . 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 'O ...
- 1713. 得到子序列的最少操作次数
给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任意位置插入任一整数.比方说,如果 arr = ...
- LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)
文章目录 1. 题目 2. 解题 1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 . 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6). 每次操作中,你可以选择 任 ...
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...
- LeetCode 1674. 使数组互补的最少操作次数(差分思想)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...
- LeetCode 2208. 将数组和减半的最少操作次数(优先队列)
文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数数组 nums .每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半.(注意,在后续操作中你可以对减半过的数继续 ...
- LeetCode简单题之最少操作使数组递增
题目 给你一个整数数组 nums (下标从 0 开始).每一次操作中,你可以选择数组中一个元素,并将它增加 1 . 比方说,如果 nums = [1,2,3] ,你可以选择增加 nums[1] 得到 ...
最新文章
- 全球及中国纳米材料行业竞争格局及发展规模预测报告2021年版
- Java NIO学习笔记之图解ByteBuffer
- Kafka: Producer (0.10.0.0)
- java远程控制win10,如何在win10系统下远程连接linux服务器?(vnc版)
- Android TabLayout和ViewPager
- 大数据分析如何应用在驾驶世界
- android studio 手把手叫你NDK开发环境搭建及基础使用
- 更新maven卡在18不动_Android Studio maven-metadata.xml 卡着不动原因和解决方法
- python: 在pycharm打开带有中文字符的文件时,乱码,File was loaded in the wrong encoding: ‘UTF-8‘
- 易软门诊管理软件php,易软门诊管理系统最新下载
- 怎么用spss做冗余分析_利用SPSS进行相关分析(第八章)概述.ppt
- debian设置IP
- SpringCloudStream基础
- 永不妥协 Never Compromise
- 什么是短网址?如何调用接口生成短地址?
- AD835乘法器电路图
- 教学优化算法的简单介绍
- STM32f429 CubeMx FreeRTOS emWin (Cubemx有BUG)
- inital,inherit,unset
- 逼死程序员的翟欣欣方首度发声了,居然这样说,你信不?
热门文章
- 深度学习-【语义分割】学习笔记4 膨胀卷积(Dilated convolution)
- 什么品牌的蓝牙耳机音质最好?高品质蓝牙耳机排行榜
- 计算机视觉和机器学习_我从计算机视觉和机器学习硕士课程中学到的东西
- excel批量重命名工作表
- Android 自定义二维码
- css实现图片毛玻璃效果
- 解读APP新一代验证登录方式——一键登录/免密认证
- 手机游戏修改客户端服务器,游戏服务器 手机客户端
- 云重磅 | 阿里巴巴平均每天纳税超1.4亿;谷歌、Face book与AWS将共建美欧新海底电缆;阿里发布谣言粉碎机:1秒辨真伪...
- 认识和使用热插拔的正确姿势-续