跳转至

3210. 找出加密后的字符串

题目描述

给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串:

  • 对于字符串 s 中的每个字符 c,用字符串中 c 后面的第 k 个字符替换 c(以循环方式)。

返回加密后的字符串。

 

示例 1:

输入: s = "dart", k = 3

输出: "tdar"

解释:

  • 对于 i = 0'd' 后面的第 3 个字符是 't'
  • 对于 i = 1'a' 后面的第 3 个字符是 'd'
  • 对于 i = 2'r' 后面的第 3 个字符是 'a'
  • 对于 i = 3't' 后面的第 3 个字符是 'r'

示例 2:

输入: s = "aaa", k = 1

输出: "aaa"

解释:

由于所有字符都相同,加密后的字符串也将相同。

 

提示:

  • 1 <= s.length <= 100
  • 1 <= k <= 104
  • s 仅由小写英文字母组成。

解法

方法一:模拟

我们可以使用模拟的方法,对字符串的第 $i$ 个字符,我们将其替换为字符串的第 $(i + k) \bmod n$ 个字符。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串 $s$ 的长度。

1
2
3
4
5
6
7
class Solution:
    def getEncryptedString(self, s: str, k: int) -> str:
        cs = list(s)
        n = len(s)
        for i in range(n):
            cs[i] = s[(i + k) % n]
        return "".join(cs)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution {
    public String getEncryptedString(String s, int k) {
        char[] cs = s.toCharArray();
        int n = cs.length;
        for (int i = 0; i < n; ++i) {
            cs[i] = s.charAt((i + k) % n);
        }
        return new String(cs);
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution {
public:
    string getEncryptedString(string s, int k) {
        int n = s.length();
        string cs(n, ' ');
        for (int i = 0; i < n; ++i) {
            cs[i] = s[(i + k) % n];
        }
        return cs;
    }
};
1
2
3
4
5
6
7
func getEncryptedString(s string, k int) string {
    cs := []byte(s)
    for i := range s {
        cs[i] = s[(i+k)%len(s)]
    }
    return string(cs)
}
1
2
3
4
5
6
7
8
function getEncryptedString(s: string, k: number): string {
    const cs: string[] = [];
    const n = s.length;
    for (let i = 0; i < n; ++i) {
        cs[i] = s[(i + k) % n];
    }
    return cs.join('');
}

评论