📌  相关文章
📜  查找最多包含K个正常字符的最长子字符串的长度

📅  最后修改于: 2021-04-29 13:09:19             🧑  作者: Mango

给定由小英文字母和26位比特字符串Q组成的字符串P ,其中1表示特殊字符0表示26个英文字母的普通字符。任务是找到最多包含K个正常字符的最长子字符串的长度。

例子:

方法:

为了解决上述问题,我们将使用两个指针的概念。因此,请保持子字符串的左右指针以及正常字符。递增右索引,直到正常字符数最多为K。然后使用直到现在为止遇到的最大子串长度来更新答案。递增左索引和递减计数,直到大于K。

下面是上述方法的实现:

C++
// C++ implementation to Find
// length of longest substring
// with at most K normal characters
#include 
using namespace std;
  
// Function to find maximum
// length of normal substrings
int maxNormalSubstring(string& P, string& Q,
                       int K, int N)
{
  
    if (K == 0)
        return 0;
  
    // keeps count of normal characters
    int count = 0;
  
    // indexes of substring
    int left = 0, right = 0;
  
    // maintain length of longest substring
    // with at most K normal characters
    int ans = 0;
  
    while (right < N) {
  
        while (right < N && count <= K) {
  
            // get position of character
            int pos = P[right] - 'a';
  
            // check if current character is normal
            if (Q[pos] == '0') {
  
                // check if normal characters
                // count exceeds K
                if (count + 1 > K)
  
                    break;
  
                else
                    count++;
            }
  
            right++;
  
            // update answer with substring length
            if (count <= K)
                ans = max(ans, right - left);
        }
  
        while (left < right) {
  
            // get position of character
            int pos = P[left] - 'a';
  
            left++;
  
            // check if character is
            // normal then decrement count
            if (Q[pos] == '0')
  
                count--;
  
            if (count < K)
                break;
        }
    }
  
    return ans;
}
  
// Driver code
int main()
{
    // initialise the string
    string P = "giraffe", Q = "01111001111111111011111111";
  
    int K = 2;
  
    int N = P.length();
  
    cout << maxNormalSubstring(P, Q, K, N);
  
    return 0;
}


Java
// Java implementation to Find
// length of longest subString
// with at most K normal characters
class GFG{
   
// Function to find maximum
// length of normal subStrings
static int maxNormalSubString(char []P, char []Q,
                       int K, int N)
{
   
    if (K == 0)
        return 0;
   
    // keeps count of normal characters
    int count = 0;
   
    // indexes of subString
    int left = 0, right = 0;
   
    // maintain length of longest subString
    // with at most K normal characters
    int ans = 0;
   
    while (right < N) {
   
        while (right < N && count <= K) {
   
            // get position of character
            int pos = P[right] - 'a';
   
            // check if current character is normal
            if (Q[pos] == '0') {
   
                // check if normal characters
                // count exceeds K
                if (count + 1 > K)
   
                    break;
   
                else
                    count++;
            }
   
            right++;
   
            // update answer with subString length
            if (count <= K)
                ans = Math.max(ans, right - left);
        }
   
        while (left < right) {
   
            // get position of character
            int pos = P[left] - 'a';
   
            left++;
   
            // check if character is
            // normal then decrement count
            if (Q[pos] == '0')
   
                count--;
   
            if (count < K)
                break;
        }
    }
   
    return ans;
}
   
// Driver code
public static void main(String[] args)
{
    // initialise the String
    String P = "giraffe", Q = "01111001111111111011111111";
   
    int K = 2;
   
    int N = P.length();
   
    System.out.print(maxNormalSubString(P.toCharArray(), Q.toCharArray(), K, N));
}
}
  
// This code is contributed by Princi Singh


Python3
# Function to find maximum 
# length of normal substrings 
def maxNormalSubstring(P, Q, K, N): 
      
    if (K == 0):
        return 0 
    
    # keeps count of normal characters 
    count = 0 
    
    # indexes of substring 
    left, right = 0, 0
      
    # maintain length of longest substring 
    # with at most K normal characters 
    ans = 0
    
    while (right < N):
    
        while (right < N and count <= K):
    
            # get position of character 
            pos = ord(P[right]) - ord('a') 
    
            # check if current character is normal 
            if (Q[pos] == '0'):
    
                # check if normal characters 
                # count exceeds K 
                if (count + 1 > K):
                    break
                else:
                    count += 1 
    
            right += 1 
    
            # update answer with substring length 
            if (count <= K):
                ans = max(ans, right - left)
    
        while (left < right): 
    
            # get position of character 
            pos = ord(P[left]) - ord('a')
    
            left += 1
    
            # check if character is 
            # normal then decrement count 
            if (Q[pos] == '0'):
                count -= 1 
    
            if (count < K):
                break 
    
    return ans
    
# Driver code 
if(__name__ == "__main__"):
    # initialise the string 
    P = "giraffe"
    Q = "01111001111111111011111111"
    
    K = 2
    
    N = len(P) 
    
    print(maxNormalSubstring(P, Q, K, N)) 
  
# This code is contributed by skylags


C#
// C# implementation to Find
// length of longest subString
// with at most K normal characters
using System;
  
public class GFG{
  
// Function to find maximum
// length of normal subStrings
static int maxNormalSubString(char []P, char []Q,
                    int K, int N)
{
  
    if (K == 0)
        return 0;
  
    // keeps count of normal characters
    int count = 0;
  
    // indexes of subString
    int left = 0, right = 0;
  
    // maintain length of longest subString
    // with at most K normal characters
    int ans = 0;
  
    while (right < N) {
  
        while (right < N && count <= K) {
  
            // get position of character
            int pos = P[right] - 'a';
  
            // check if current character is normal
            if (Q[pos] == '0') {
  
                // check if normal characters
                // count exceeds K
                if (count + 1 > K)
  
                    break;
  
                else
                    count++;
            }
  
            right++;
  
            // update answer with subString length
            if (count <= K)
                ans = Math.Max(ans, right - left);
        }
  
        while (left < right) {
  
            // get position of character
            int pos = P[left] - 'a';
  
            left++;
  
            // check if character is
            // normal then decrement count
            if (Q[pos] == '0')
  
                count--;
  
            if (count < K)
                break;
        }
    }
  
    return ans;
}
  
// Driver code
public static void Main(String[] args)
{
    // initialise the String
    String P = "giraffe", Q = "01111001111111111011111111";
  
    int K = 2;
  
    int N = P.Length;
  
    Console.Write(maxNormalSubString(P.ToCharArray(),
                     Q.ToCharArray(), K, N));
}
}
  
// This code contributed by Princi Singh


输出:
3

时间复杂度:上述方法需要O(N)时间。