📌  相关文章
📜  从给定的操作获得的第N个字符串第K字符

📅  最后修改于: 2021-04-24 04:37:46             🧑  作者: Mango

给定两个正整数NK ,任务是找到通过对字符串S (最初为“ A” )执行N次以下操作获得的字符串的K字符。

例子:

方法:想法是使用递归从先前生成的字符串生成新字符串,并重复该过程,直到执行N次操作为止。步骤如下:

  1. 将两个字符串prev初始化为“ A”,并以空字符串curr出现。
  2. 如果N = 1,则返回上一个,否则执行以下操作。
  3. 循环(N – 1)次,每次更新为prev +“ B”
  4. 反转字符串prev
  5. 再次将字符串curr字符串更新为curr + prev
  6. 将字符串prev更新为curr
  7. 完成上述步骤后,返回字符串curr的第(K – 1)个字符

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to return Kth character
// from recursive string
char findKthChar(int n, int k)
{
    string prev = "A";
    string cur = "";
 
    // If N is 1 then return A
    if (n == 1) {
        return 'A';
    }
 
    // Iterate a loop and generate
    // the recursive string
    for (int i = 2; i <= n; i++) {
 
        // Update current string
        cur = prev + "B";
 
        // Change A to B and B to A
        for (int i = 0;
             i < prev.length(); i++) {
 
            if (prev[i] == 'A') {
                prev[i] = 'B';
            }
            else {
                prev[i] = 'A';
            }
        }
 
        // Reverse the previous string
        reverse(prev.begin(), prev.end());
        cur += prev;
        prev = cur;
    }
 
    // Return the kth character
    return cur[k - 1];
}
 
// Driver Code
int main()
{
    int N = 4;
    int K = 3;
 
    cout << findKthChar(N, K);
    return 0;
}


Java
// Java program for
// the above approach
import java.util.*;
class GFG{
   
// String reverse
static String reverse(String input)
{
  char[] a = input.toCharArray();
  int l, r = a.length - 1;
  for (l = 0; l < r; l++, r--)
  {
    char temp = a[l];
    a[l] = a[r];
    a[r] = temp;
  }
  return String.valueOf(a);
}
   
// Function to return Kth character
// from recursive String
static char findKthChar(int n,
                        int k)
{
  String prev = "A";
  String cur = "";
 
  // If N is 1 then return A
  if (n == 1)
  {
    return 'A';
  }
 
  // Iterate a loop and generate
  // the recursive String
  for (int j = 2; j <= n; j++)
  {
    // Update current String
    cur = prev + "B";
 
    // Change A to B and B to A
    for (int i = 0; i < prev.length(); i++)
    {
      if (prev.charAt(i) == 'A')
      {
        prev.replace(prev.charAt(i), 'B');
      }
      else
      {
        prev.replace(prev.charAt(i), 'A');
      }
    }
 
    // Reverse the previous String
    prev = reverse(prev);
    cur += prev;
    prev = cur;
  }
 
  // Return the kth character
  return cur.charAt(k);
}
 
// Driver Code
public static void main(String[] args)
{
  int N = 4;
  int K = 3;
  System.out.print(findKthChar(N, K));
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program for the above approach
 
# Function to return Kth character
# from recursive string
def findKthChar(n, k):
 
    prev = "A"
    cur = ""
 
    # If N is 1 then return A
    if (n == 1):
        return 'A'
 
    # Iterate a loop and generate
    # the recursive string
    for i in range(2, n + 1):
 
        # Update current string
        cur = prev + "B"
 
        # Change A to B and B to A
        temp1 = [y for y in prev]
         
        for i in range(len(prev)):
            if (temp1[i] == 'A'):
                temp1[i] = 'B'
            else:
                temp1[i] = 'A'
 
        # Reverse the previous string
        temp1 = temp1[::-1]
        prev = "".join(temp1)
        cur += prev
        prev = cur
 
    # Return the kth character
    return cur[k - 1]
 
# Driver Code
if __name__ == '__main__':
     
    N = 4
    K = 3
 
    print(findKthChar(N, K))
 
# This code is contributed by mohit kumar 29


C#
// C# program for
// the above approach
using System;
class GFG{
   
// String reverse
static String reverse(String input)
{
  char[] a = input.ToCharArray();
  int l, r = a.Length - 1;
  for (l = 0; l < r; l++, r--)
  {
    char temp = a[l];
    a[l] = a[r];
    a[r] = temp;
  }
  return String.Join("", a);
}
   
// Function to return Kth character
// from recursive String
static char findKthChar(int n,
                        int k)
{
  String prev = "A";
  String cur = "";
 
  // If N is 1 then return A
  if (n == 1)
  {
    return 'A';
  }
 
  // Iterate a loop and generate
  // the recursive String
  for (int j = 2; j <= n; j++)
  {
    // Update current String
    cur = prev + "B";
 
    // Change A to B and B to A
    for (int i = 0; i < prev.Length; i++)
    {
      if (prev[i] == 'A')
      {
        prev.Replace(prev[i], 'B');
      }
      else
      {
        prev.Replace(prev[i], 'A');
      }
    }
 
    // Reverse the previous String
    prev = reverse(prev);
    cur += prev;
    prev = cur;
  }
 
  // Return the kth character
  return cur[k];
}
 
// Driver Code
public static void Main(String[] args)
{
  int N = 4;
  int K = 3;
  Console.Write(findKthChar(N, K));
}
}
 
// This code is contributed by Rajput-Ji


输出:
B







时间复杂度: O(N 2 )
辅助空间: O(1)