列表

详情


2734. 执行子串操作后的字典序最小字符串

给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以完成以下行为:

返回执行上述操作 恰好一次 后可以获得的 字典序最小 的字符串。

子字符串 是字符串中的一个连续字符序列。

现有长度相同的两个字符串 x 和 字符串 y ,在满足 x[i] != y[i] 的第一个位置 i 上,如果  x[i] 在字母表中先于 y[i] 出现,则认为字符串 x 比字符串 y 字典序更小

 

示例 1:

输入:s = "cbabc"
输出:"baabc"
解释:我们选择从下标 0 开始、到下标 1 结束的子字符串执行操作。 
可以证明最终得到的字符串是字典序最小的。

示例 2:

输入:s = "acbbc"
输出:"abaab"
解释:我们选择从下标 1 开始、到下标 4 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。

示例 3:

输入:s = "leetcode"
输出:"kddsbncd"
解释:我们选择整个字符串执行操作。
可以证明最终得到的字符串是字典序最小的。

 

提示:

原站题解

去查看

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

rust 解法, 执行用时: 3 ms, 内存消耗: 3.3 MB, 提交时间: 2024-06-27 22:27:15

impl Solution {
    pub fn smallest_string(S: String) -> String {
        let mut s = S.into_bytes();
        let n = s.len();
        for i in 0..n {
            if s[i] > b'a' {
                // 继续向后遍历
                for j in i..n {
                    if s[j] == b'a' {
                        break;
                    }
                    s[j] -= 1;
                }
                return unsafe { String::from_utf8_unchecked(s) };
            }
        }
        // 所有字母均为 a
        s[n - 1] = b'z';
        unsafe { String::from_utf8_unchecked(s) }
    }
}

javascript 解法, 执行用时: 186 ms, 内存消耗: 80.3 MB, 提交时间: 2024-06-27 22:27:01

/**
 * @param {string} s
 * @return {string}
 */
var smallestString = function(S) {
    const s = S.split('');
    const n = s.length;
    for (let i = 0; i < n; i++) {
        if (s[i] > 'a') {
            // 继续向后遍历
            for (; i < n && s[i] > 'a'; i++) {
                s[i] = String.fromCharCode(s[i].charCodeAt(0) - 1);
            }
            return s.join('');
        }
    }
    // 所有字母均为 a
    s[n - 1] = 'z';
    return s.join('');
}

golang 解法, 执行用时: 44 ms, 内存消耗: 7.4 MB, 提交时间: 2023-06-13 14:48:13

func smallestString(s string) (ans string) {
	t := []byte(s)
	for i, c := range t {
		if c > 'a' {
			for ; i < len(t) && t[i] > 'a'; i++ {
				t[i]--
			}
			return string(t)
		}
	}
	t[len(t)-1] = 'z'
	return string(t)
}

cpp 解法, 执行用时: 88 ms, 内存消耗: 39.2 MB, 提交时间: 2023-06-13 14:48:01

class Solution {
public:
    string smallestString(string s) {
        int n = s.length();
        for (int i = 0; i < n; i++) {
            if (s[i] > 'a') {
                for (; i < n && s[i] > 'a'; i++)
                    s[i]--;
                return s;
            }
        }
        s.back() = 'z';
        return s;
    }
};

java 解法, 执行用时: 18 ms, 内存消耗: 47.4 MB, 提交时间: 2023-06-13 14:47:50

class Solution {
    public String smallestString(String S) {
        var s = S.toCharArray();
        int n = s.length;
        for (int i = 0; i < n; i++) {
            if (s[i] > 'a') {
                for (; i < n && s[i] > 'a'; i++)
                    s[i]--;
                return new String(s);
            }
        }
        s[n - 1] = 'z';
        return new String(s);
    }
}

python3 解法, 执行用时: 172 ms, 内存消耗: 21.6 MB, 提交时间: 2023-06-13 14:47:38

'''
根据题意,把 a 替换成 z 会让字典序变大,所以子串里面是不能包含 a 的。
替换其它字符可以让字典序变小。

那么从左到右找到第一个不等于 a 的字符 s[i],并向后不断减一,直到 s 末尾或者遇到了 a。
特别地,如果 s 全为 a,由于题目要求选择的子串是非空的,且必须操作一次,那么就把最后一个 a 改成 z。
'''
class Solution:
    def smallestString(self, s: str) -> str:
        t = list(s)
        for i, c in enumerate(t):
            if c != 'a':
                for j in range(i, len(t)):
                    if t[j] == 'a': break
                    t[j] = chr(ord(t[j]) - 1)
                return ''.join(t)
        t[-1] = 'z'
        return ''.join(t)

上一题