Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

해독된 문자열의 k번째 문자 찾기 - C++에서 Set – 2

<시간/>

컨셉

부분 문자열의 반복이 부분 문자열 뒤에 오는 부분 문자열로 표시되는 인코딩된 문자열과 관련하여. 예를 들어 암호화된 문자열이 "pq2rs2"이고 k=5인 경우 복호화된 문자열이 "pqpqrsrs"이고 5번째 문자가 'r'이므로 출력은 'r'이 됩니다.

암호화된 하위 문자열의 빈도는 두 자리 이상일 수 있습니다. 따라서 예를 들어 "pq12r3"에서 pq는 12번 반복됩니다. 여기에서 하위 문자열의 빈도에 선행 0이 없습니다.

입력

"p2q2r3", k = 6

출력

r

해독된 문자열은 "ppqqrrr"입니다.

입력

"pq4r2ts3", k = 11

출력

t

해독된 문자열은 "pqpqpqpqrrtststs"입니다.

방법

여기에서 단계적 알고리즘은 -

  • 현재 부분 문자열의 길이를 결정합니다. 두 개의 포인터를 구현합니다. 부분 문자열의 시작 부분에서 하나의 포인터를 수정하고 숫자를 찾을 수 없을 때까지 다른 포인터를 계속 진행해야 합니다.
  • 알파벳을 찾을 수 없을 때까지 두 번째 포인터를 더 이동하여 반복 빈도를 결정합니다.
  • 빈도와 원래 길이를 곱하여 반복되는 부분 문자열의 길이를 결정합니다.
  • 이 길이가 k보다 작으면 필요한 문자가 뒤에 오는 부분 문자열에 있는 것으로 관찰되었습니다. 커버해야 하는 문자 수를 유지하려면 k에서 이 길이를 빼야 합니다.

  • 길이가 k보다 작거나 같으면 필요한 문자가 현재 부분 문자열에 있는 것으로 나타났습니다. k는 1-인덱싱되므로 1로 줄인 다음 원래 부분 문자열 길이로 mod를 취합니다. 여기서 필수 문자는 첫 번째 포인터가 가리키는 부분 문자열의 시작부터 k번째 문자입니다.

예시

// C++ program to find K'th character in
// decrypted string
#include <bits/stdc++.h>
using namespace std;
// Shows function to find K'th character in
// Encoded String
char encodedChar(string str, int k){
   int a, b;
   int m = str.length();
   // Used to store length of substring
   int len1;
   // Used to store length of substring when
   // it is repeated
   int num1;
   // Used to store frequency of substring
   int freq1;
   a = 0;
   while (a < m) {
      b = a;
      len1 = 0;
      freq1 = 0;
      // Determine length of substring by
      // traversing the string until
      // no digit is found.
      while (b < m && isalpha(str[b])) {
      b++;
      len1++;
   }
   // Determine frequency of preceding substring.
   while (b < m && isdigit(str[b])) {
      freq1 = freq1 * 10 + (str[b] - '0');
      b++;
   }
   // Determine length of substring when
   // it is repeated.
   num1 = freq1 * len1;
   // It has been seen that if length of repeated substring is
   less than // k then required character is present in next
   // substring. Subtract length of repeated
   // substring from k to keep account of number of
   // characters required to be visited.
   if (k > num1) {
      k -= num1;
      a = b;
   }
   // It has been seen that if length of repeated substring is
   // more or equal to k then required
   // character lies in current substring.
      else {
         k--;
         k %= len1;
         return str[a + k];
      }
   }
   // This is for the case when there
   // are no repetition in string.
   // e.g. str="abced".
   return str[k - 1];
}
// Driver Code
int main(){
   string str1 = "pqpqpqpqrrtststs";
   int k1 = 11;
   cout << encodedChar(str1, k1) << endl;
   string str2 = "p2q2r3";
   int k2 = 6;
   cout << encodedChar(str2, k2) << endl;
   return 0;
}

출력

t
r