LeetCode 1585 Check If String Is Transformable With Substring Sort Operations
时间:2022-07-25
本文章向大家介绍LeetCode 1585 Check If String Is Transformable With Substring Sort Operations,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:一个只有0-9组成的字符串,每次选择任意一个子串,按照数字从小到大排序。问从源字符串能否经过若干次操作转换成目标字符串。
题解:首先题目只问了是否,而没有问多少次,所以可以判断出,我们不关心过程是怎么样的,只关心结果能否到达。所以不太可能是动态规划,搜索什么的。 既然是看结果,那估计是个找规律的题目。首先看目标字符串的第一个字符x,如果它是由源字符串的某个字符x经过排序之后,安排到了第一个位置,那么它一定满足,在源字符串中从起始位置到x的位置的子串中,x一定是最小的那个。否则x就无法移动到第一个位置。 一次内推,第二个字符x2, 由于第一个字符x已经确定了我们把x变成最大值,那么x2应该满足从源字符串起始位置到x2的位置的子串中,x2是最小的那个。
所以这道题目就变成了单点更新,求区间最值。 使用简单优雅的数据结构,树状数组,即可解决问题。 树状数组的区间最值,要比区间和复杂一点,且更新的时间效率是Log(n)*Log(n) 跟线段树比差一点。
class Solution {
public:
int c[100005];
int a[100005];
vector<int> pos[10];
int n;
bool isTransformable(string s, string t) {
for(int i = s.length()-1;i>=0;i--)
{
int num = s[i]-'0';
pos[num].push_back(i+1);
}
n = s.length();
for(int i=0;i<=n;i++)
{
c[i] = INT_MAX;
}
for(int i=0;i<s.length();i++)
{
add(i+1,s[i]-'0');
a[i+1]=s[i]-'0';
}
for(int i=0;i<t.length();i++)
{
if(pos[t[i]-'0'].size()==0)
return false;
int p = pos[t[i]-'0'].back();
pos[t[i]-'0'].pop_back();
int m = get(1,p);
if(m!=t[i]-'0')
return false;
add(p,INT_MAX);
}
return true;
}
int lowbit(int x)
{
return x&(-x);
}
void add(int index,int num)
{
a[index] = num;
while(index<=n)
{
int l = index-lowbit(index)+1;
int m = get(l, index-1);
if(l==index)
{
c[index]=a[index];
}
else if(min(m, a[index])!=c[index])
{
c[index]=min(m, a[index]);
}
else
{
break;
}
index+=lowbit(index);
}
}
int get(int l, int r)
{
if(l>r)
return INT_MAX;
int ans = INT_MAX;
while(r>=l)
{
if(r-lowbit(r) < l-1)
{
ans = min(ans, a[r]);
r--;
}
else
{
ans = min(ans, c[r]);
r-=lowbit(r);
}
}
return ans;
}
};
- JavaScript引用类型之Array数组的栈方法与队列方法
- ExtJs学习笔记(14)_Column布局
- 高级盲注—floor,rand,group by报错注入
- 刷脸注册、试装、支付……仅靠一张脸就能买买买的时尚店开业了
- JavaScript引用类型之Array数组之强大的splice()方法
- Linux快速入门03-系统管理
- JavaScript引用类型之Array数组的concat()和push()方法的区别
- JavaScript引用类型之Array数组的排序方法
- Linux快速入门02-文件系统管理
- JavaScript引用类型之Array数组的toString()和valueof()方法的区别
- Linux快速入门04-扩展知识
- JavaScript引用类型之Array数组的拼接方法-concat()和截取方法-slice()
- JavaScript引用类型之Array数组的拼接方法-concat()和截取方法-slice()
- 比特币在2017全球新闻谷歌搜索中排名第二,韩国政府聚焦比特币市场诈骗和假冒交易所
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Nginx用户认证与域名重定向
- LNMP架构介绍与搭建
- Mac 最新版Python3.7.4安装配置,设置默认python版本
- 15个应该掌握的Jupyter Notebook 使用技巧
- python 环境重启方法,系统环境变量配置后python生效设置方法
- 快速上手 WebAssembly 应用开发:Emscripten 使用入门
- Python爬虫之mongodb的索引操作
- (六)日志生成
- Python爬虫之mongodb的权限管理
- Python爬虫之mongodb和python交互
- 转录组分析 | 使用RSeQC软件对生成的BAM文件进行质控
- 转录组分析 | 使用Stringtie对数据进行下游处理
- 存在重复元素
- CentOS7下LNMP环境搭建Discuz论坛
- 【小项目】使用shell和expect实现简易的文件分发系统