欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1585 检查字符串是否可以通过排序子字符串得到另一个字符串

程序员文章站 2023-12-22 20:04:46
...

题目描述:
给你两个字符串 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;
    }
};
相关标签: LeetCode

上一篇:

下一篇: