列表

详情


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

给你两个字符串 s 和 t ,请你通过若干次以下操作将字符串 s 转化成字符串 t :

比方说,对下划线所示的子字符串进行操作可以由 "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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool isTransformable(string s, string t) { } };

golang 解法, 执行用时: 16 ms, 内存消耗: 7.2 MB, 提交时间: 2023-09-23 00:47:03

func isTransformable(s string, t string) bool {

	posMap := make([][]int, 10)

	for i := 0; i < len(s); i++ {
		posMap[int(s[i]-'0')] = append(posMap[int(s[i]-'0')], i) //记录s中每个字符出现的位置
	}

	//对于t中的每个字符 判断
	for i := 0; i < len(t); i++ {
		num := int(t[i] - '0')
		pos := posMap[num]
		if len(pos) == 0 { //在s中没有对应的字符 肯定无法完成
			return false
		}

		// t[i]在s中的第一个出现位置 pos[0]
		// 判断s中,是否有比num小的出现在pos[0]之前,挡住了移动的道路
		for j := 0; j < num; j++ {

			//如果数字j在s中的第一个位置在 pos[0]前面,挡住了移动的道路
			if len(posMap[j]) > 0 && posMap[j][0] < pos[0] {
				return false
			}
			//如果数字j在s中的第一个位置在 pos[0]后面,由于posMap是单调递增的,所以数字j在s中的位置肯定都是大于pos[0]的

		}

		//s中,比num小的数字都在pos[0]后面
		posMap[num] = pos[1:]
	}

	return true

}

java 解法, 执行用时: 35 ms, 内存消耗: 47.2 MB, 提交时间: 2023-09-23 00:46:39

class Solution {
    public boolean isTransformable(String s, String t) {
        int n = s.length();
        Queue<Integer>[] pos = new Queue[10];
        for (int i = 0; i < 10; ++i) {
            pos[i] = new LinkedList<Integer>();
        }
        for (int i = 0; i < n; ++i) {
            pos[s.charAt(i) - '0'].offer(i);
        }
        for (int i = 0; i < n; ++i) {
            int digit = t.charAt(i) - '0';
            if (pos[digit].isEmpty()) {
                return false;
            }
            for (int j = 0; j < digit; ++j) {
                if (!pos[j].isEmpty() && pos[j].peek() < pos[digit].peek()) {
                    return false;
                }
            }
            pos[digit].poll();
        }
        return true;
    }
}

cpp 解法, 执行用时: 76 ms, 内存消耗: 18.3 MB, 提交时间: 2023-09-23 00:46:23

class Solution {
public:
    bool isTransformable(string s, string t) {
        int n = s.size();
        vector<queue<int>> pos(10);
        for (int i = 0; i < n; ++i) {
            pos[s[i] - '0'].push(i);
        }
        for (int i = 0; i < n; ++i) {
            int digit = t[i] - '0';
            if (pos[digit].empty()) {
                return false;
            }
            for (int j = 0; j < digit; ++j) {
                if (!pos[j].empty() && pos[j].front() < pos[digit].front()) {
                    return false;
                }
            }
            pos[digit].pop();
        }
        return true;
    }
};

python3 解法, 执行用时: 604 ms, 内存消耗: 20.4 MB, 提交时间: 2023-09-23 00:46:17

class Solution:
    # 冒泡排序
    def isTransformable(self, s: str, t: str) -> bool:
        n = len(s)
        pos = {i: collections.deque() for i in range(10)}
        for i, digit in enumerate(s):
            pos[int(digit)].append(i)
        
        for i, digit in enumerate(t):
            d = int(digit)
            if not pos[d]:
                return False
            if any(pos[j] and pos[j][0] < pos[d][0] for j in range(d)):
                return False
            pos[d].popleft()
        
        return True

上一题