Java 程序求具有相同左右旋转的数字的最长子序列

javaobject oriented programmingprogramming更新于 2024/8/5 1:52:00

在这个问题中,我们需要找到具有相同左右旋转的最长子序列的长度。

我们可以使用蛮力方法解决这个问题,找到给定字符串的所有可能子序列,并逐个检查每个子序列以查看它是否具有相同的左右旋转。我们找到这种子序列的最大长度。这种方法的问题在于它非常耗时,因为它的时间复杂度是 O(2N)。

因此,我们将学习用这种方法编写优化代码。

问题陈述– 我们给出了包含 N 个数字字符的字符串 str。我们需要找到给定字符串中具有相同左旋转和右旋转的最长子序列。

示例

输入– str = "9898798"

输出– 6

解释– 我们有具有相同左旋转和右旋转的最长子序列,即 989898。

输入– str = '12345678'

输出– 2

解释– 我们可以选择任何长度为 2 的子序列,因为它始终具有相同的左旋转和右旋转。

输入– '327787767777'

输出– 8

解释– 具有相同左旋转和右旋转的最长子序列是'77777777'。

方法 1

在这种方法中,我们将根据特定观察来解决问题。只有当字符串的所有数字都相等或交替包含两位数字,并且字符串长度为偶数时,字符串的左右旋转才相同。

在这里,我们将尝试找到相同或交替数字的子序列。

算法

  • 用字符串长度初始化"len"变量,用0初始化"cnt"变量以存储子序列的最大长度。

  • 使用两个嵌套循环从0到9遍历并获取每个数字的组合。

  • 定义"cur_len"变量以存储当前子序列的长度。此外,定义"firstDigit"变量来跟踪下一个数字是变化数字序列中的第 p 位还是第 q 位。

  • 使用第三个嵌套循环遍历数字字符串。

  • 如果 firstDigit == 0 && str.charAt(k) - '0' ==pI 为真,则将 firstDigit 的值更改为 1,并将 cur 增加 1。

  • 如果 firstDigit == 1 && str.charAt(k) - '0' == q 为真,则将 firstDigit 的值更改为 0,并将"cur_len"增加 1。

  • 如果 p 和 q 不相同,并且"cur_len"的值为奇数,则将"cur_len"减少 1。

  • 如果"cnt"的值'cur_len' 大于 'cnt' 值。

  • 返回 'cnt' 值。

示例

import java.util.*;
public class Main {
   static int findLongestSub(String str) {
      int len = str.length(), cnt = 0;
      // 遍历字符串的每个组合。
      for (int p = 0; p < 10; p++) {
          for (int q = 0; q < 10; q++) {
              int cur_len = 0, firstDigit = 0;
              // 寻找交替序列
              for (int r = 0; r < len; r++) {
                  if (firstDigit == 0 && str.charAt(r) - '0' == p) {
                      firstDigit = 1;
                      // add 1 
                      cur_len++;
                  } else if (firstDigit == 1 && str.charAt(r) - '0' == q) {
                      firstDigit = 0;
                      // add 1 
                      cur_len++;
                  }
              }
              // 如果当前值为奇数,则减 1
              if (p != q && cur_len % 2 == 1)
                  cur_len--;
              // 更新cnt值
              cnt = Math.max(cur_len, cnt);
          }
      }
      // 返回结果
      return cnt;
   }
   public static void main(String[] args) {
      String str = "9898798";
      System.out.print("左右旋转相同的最长子序列的长度为"
               + findLongestSub(str));
   }
}

输出

具有相同左和右旋转的最长子序列的长度为 6

时间复杂度 – O(N),因为我们遍历长度为 K 的数字字符串。

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

在本教程中,我们学习了如何找到具有相同左和右旋转的子序列的最大长度。程序员可以尝试使用蛮力方法来解决,方法是使用代码查找给定字符串的所有可能子序列。


相关文章