1585 检查字符串是否可以通过排序子字符串得到另一个字符串
题目描述:
给你两个字符串 s 和 t ,请你通过若干次以下操作将字符串 s 转化成字符串 t :
选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。
比方说,对下划线所示的子字符串进行操作可以由 “14234” 得到 “12344” 。
如果可以将字符串 s 变成 t ,返回 true 。否则,返回 false 。
一个 子字符串 定义为一个字符串中连续的若干字符。
示例 1:
输入:s = “84532”, t = “34852”
输出:true
解释:你可以按以下操作将 s 转变为 t :
“84532” (从下标 2 到下标 3)-> “84352”
“84352” (从下标 0 到下标 2) -> “34852”
示例 2:
输入:s = “34521”, t = “23415”
输出:true
解释:你可以按以下操作将 s 转变为 t :
“34521” -> “23451”
“23451” -> “23415”
示例 3:
输入:s = “12345”, t = “12435”
输出:false
示例 4:
输入:s = “1”, t = “2”
输出:false
提示:
s.length == t.length
1 <= s.length <= 105
s 和 t 都只包含数字字符,即 ‘0’ 到 ‘9’ 。
通过次数1,838提交次数4,335
方法1:
主要思路:解题汇总链接
(1)参考官方题解;
(2)对于s中的数字进行统计,使每个数字出现的索引位置按照先后顺序存储到对应的队列中;
(3)对于t中i位置的数字,在s的统计中,其前面的数字应该都是大于该数字的数字,否则不能通过交换,将该数字交换到对应的i位置,若满足要求,则在s的统计中将该数字对应的索引从队列中弹出;
class Solution {
public:
bool isTransformable(string s, string t) {
if(s.size()!=t.size()){
return false;
}
//统计s中各个数字出现的位置,存储到对应的队列中
vector<queue<int>> indexs(10);
for(int i=0;i<s.size();++i){
indexs[s[i]-'0'].push(i);
}
for(char&ch:t){
int digit=ch-'0';//t中当前要判读的数字
if(indexs[digit].empty()){//说明s中此时不再存在该数字,直接返回false
return false;
}
for(int i=0;i<digit;++i){//判断当前数字前面的数字都是大于该数字的数字,否则返回false
if(!indexs[i].empty()&&indexs[i].front()<indexs[digit].front()){
return false;
}
}
indexs[digit].pop();//弹出当前判断过的数字
}
return true;
}
};