Java 程序用于在常数时间内查询给定字符串的旋转和第 K 个字符


在这个问题中,程序员需要对字符串执行查询。此外,还需要旋转字符串并打印更新后的字符串的字符。解决此问题的最佳方法是不断更新索引值,并在需要打印字符时访问字符串字符。

问题陈述 – 我们给定字符串 alpha 和包含名为 'que' 的数字对的数组。任务是在字符串 alpha 上执行数组中给出的查询。

遵循以下查询操作规则。

  • (1, a) – 对给定字符串进行总共左旋转。

  • (2, a) – 打印第 a 个位置的字符。

注意 – 这里,a 的值是 1 到 N,其中 N 是字符串的长度。

示例

输入

que[][] = { { 1, 1 }, { 2, 1 }, { 2, 5 }, { 1, 3 } }, alpha = "wqedsdcs";

输出

q, d

解释 – 让我们逐一在字符串上执行所有查询。

  • 第一个查询将字符串旋转 1 位,更新后的字符串将为 'qedsdcsw'。

  • 第二个查询打印第 1 个位置的字符,即 'q'。

  • 第三个查询打印第 5 个位置的字符,即 'd'。

  • 第四个查询进行 3 次左旋转。

输入

que[][] = { { 1, 1 }, { 2, 3 }, { 1, 8 }, { 2, 7 } }, alpha = "tutorialspoint"

输出

o, u

解释

  • 执行第一个查询后,字符串变为 'utorialspoint'。

  • 更新后的字符串中第 3 个位置的字符是 'o'。

  • 执行第三个查询后,字符串变为 'pointtutorials'。

  • 第 7 个位置的字符是 'u'。

方法 1

在这种方法中,我们定义索引指针来跟踪当前索引。我们跟踪最后一个索引以在最后一个索引上执行下一个查询。

算法

步骤 1 – 定义 'curr' 变量以跟踪最新索引。

步骤 2 – 使用 for 循环遍历查询数组。

步骤 3 – 从第 m 个索引获取查询,如果查询对的第一个元素为 1,我们需要对最后更新的字符串进行 'a' 次旋转。

步骤 4 – 在这种情况下,我们将 'curr' 值更新为将对的第二个元素添加到 'curr' 并取其对 26 的模。

步骤 5 – 如果查询对的第一个元素为 2,我们需要打印给定索引处的字符。

步骤 6 – 将 'curr' 变量的值更新为将查询对的第二个元素添加到 'curr' 并取其对 26 的模。

步骤 7 – 访问原始字符串中 'curr' 索引处的字符。此外,在输出中显示字符。

示例

import java.util.*;

public class main {
    static void executeQueries(String alpha, int str_len, int que[][], int que_len) {
        // Current pointer pointing to the starting
        int curr = 0;
        // Traverse array
        for (int m = 0; m < que_len; m++) {
            // Query rotation
            if (que[m][0] == 1) {
                // Update value of curr
                curr = (curr + que[m][1]) % str_len;
            } else {
                int ch = que[m][1];
                // Get the index of the character in rotation
                int index = (curr + ch - 1) % str_len;
                // Show output
                System.out.println(alpha.charAt(index));
            }
        }
    }
    public static void main(String[] args) {
        String alpha = "wqedsdcs";
        int str_len = alpha.length();
        int que[][] = { { 1, 1 }, { 2, 1 },
                { 2, 5 }, { 1, 3 } };
        int que_len = que.length;
        executeQueries(alpha, str_len, que, que_len);
    }
}

输出

q
d

时间复杂度 – O(M),因为我们逐一执行所有查询。

空间复杂度 – O(1),因为我们没有使用任何动态空间。

程序员也可以尝试使用朴素方法来解决问题。在朴素方法中,程序员可以旋转字符串以执行第一个查询,并访问更新后的字符串中的字符以执行第二个查询。执行字符串旋转的方法有 1 到 2 种不同的方法;一种是将字符串与其自身连接起来并获取其子字符串。

更新于: 2023年8月24日

68 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告