给定两个正整数N和K ,任务是找到通过对字符串S (最初为“A” )执行N次以下操作而获得的字符串的第K个字符。
Every ith operation generates following string (Si):
Si = Si – 1 + ‘B’ + rev(comp(Si – 1))
where,
comp() denotes the complement of string i.e., A is changed to B and B is changed to A.
and rev() returns the reverse of a string.
例子:
Input: N = 3, K = 1
Output: A
Explanation:
Initially, after first operation, S1 = “A”
After 2nd operation, S2 = “ABB”
After 3rd operation, S3 = “ABBBAAB”
The first character of S3 is ‘A’.
Input: N = 2, K = 3
Output: B
做法:思路是用递归从之前生成的字符串生成新的字符串,重复这个过程,直到进行了N次操作。以下是步骤:
- 将两个字符串prev初始化为“A”,将curr初始化为空字符串。
- 如果N = 1则返回 prev 否则执行下面的操作。
- 迭代循环(N – 1)次,每次将 curr 更新为prev + “B” 。
- 反转字符串prev 。
- 再次将字符串curr字符串更新为curr + prev 。
- 将字符串prev更新为curr 。
- 经过上述步骤后,返回字符串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)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live