每个字符的频率小于等于k的最长子字符串

给一根绳子 str 长度 N .问题是要找出最长子字符串的长度 str 每个字符的频率小于等于给定值的 K . 例如:

null
Input : str = "babcaag", k = 1Output : 3abc and bca are the two longestsub-strings having frequency of each character in them less than equal to '1'.Input : str = "geeksforgeeks", k = 2Output : 10

方法: 创建一个数组 频率[] 大小为26的,实现为哈希表,用于存储 str 。使用值“0”初始化其所有索引。绳子的长度是 N .现在实现以下算法。

longSubstring(str, k)    Initialize start = 0    Initialize maxLen = 0    Declare ch        for i = 0 to n-1        ch = str[i]    freq[ch - 'a']++    if k < freq[ch - 'a'] then        if maxLen < (i - start) then            maxLen = i - start        while (k < freq[ch - 'a'])                freq[str[start] - 'a']--        start++    if maxLen < (n - start) then        maxLen = n - start        return maxLen

C++

// C++ implementation to find
// the length of the longest
// substring having frequency
// of each character less
// than equal to k
#include <bits/stdc++.h>
using namespace std;
#define SIZE 26
// function to find the length
// of the longest substring
// having frequency of each
// character less than equal
// to k
int longSubstring(string str, int k)
{
// hash table to store frequency
// of each table
int freq[SIZE];
// Initialize
memset (freq, 0, sizeof (freq));
// 'start' index of the current
// substring
int start = 0;
// to store the maximum length
int maxLen = 0;
char ch;
int n = str.size();
// traverse the string 'str'
for ( int i = 0; i < n; i++)
{
// get the current character
// as 'ch'
ch = str[i];
// increase frequency of
// 'ch' in 'freq[]'
freq[ch - 'a' ]++;
// if frequency of 'ch' becomes
// more than 'k'
if (freq[ch - 'a' ] > k)
{
// update 'maxLen'
if (maxLen < (i - start))
maxLen = i - start;
// decrease frequency of
// each character as they
// are encountered from
// the 'start' index until
// frequency of 'ch' is
// greater than 'k'
while (freq[ch - 'a' ] > k)
{
// decrement frequency
// by '1'
freq[str[start] - 'a' ]--;
// increment 'start'
start++;
}
}
}
// update maxLen
if (maxLen < (n - start))
maxLen = n - start;
// required length
return maxLen;
}
// Driver program to test above
int main()
{
string str = "babcaag" ;
int k = 1;
cout << "Length = "
<< longSubstring(str, k);
return 0;
}


JAVA

// Java implementation to find
// the length of the longest
// substring having frequency
// of each character less
// than equal to k
import java.util.*;
import java.lang.*;
public class GfG{
public final static int SIZE = 26 ;
// function to find the length
// of the longest substring
// having frequency of each
// character less than equal
// to k
public static int longSubstring(String str1,
int k)
{
// hash table to store frequency
// of each table
int [] freq = new int [SIZE];
char [] str = str1.toCharArray();
// 'start' index of the current
// substring
int start = 0 ;
// to store the maximum length
int maxLen = 0 ;
char ch;
int n = str1.length();
// traverse the string 'str'
for ( int i = 0 ; i < n; i++)
{
// get the current character
// as 'ch'
ch = str[i];
// increase frequency of
// 'ch' in 'freq[]'
freq[ch - 'a' ]++;
// if frequency of 'ch'
// becomes more than 'k'
if (freq[ch - 'a' ] > k)
{
// update 'maxLen'
if (maxLen < (i - start))
maxLen = i - start;
// decrease frequency of
// each character as they
// are encountered from
// the 'start' index until
// frequency of 'ch' is
// greater than 'k'
while (freq[ch - 'a' ] > k)
{
// decrement frequency
// by '1'
freq[str[start] - 'a' ]--;
// increment 'start'
start++;
}
}
}
// update maxLen
if (maxLen < (n - start))
maxLen = n - start;
// required length
return maxLen;
}
// Driver function
public static void main(String argc[])
{
String str = "babcaag" ;
int k = 1 ;
System.out.println( "Length = " +
longSubstring(str, k));
}
}
/* This code is contributed by Sagar Shukla */


Python3

# Python3 implementation to find
# the length of the longest
# substring having frequency
# of each character less than
# equal to k
# import library
import numpy as np
SIZE = 26
# Function to find the length
# of the longest sub having
# frequency of each character
# less than equal to k
def longSub( str , k):
# Hash table to store frequency
# of each table
freq = np.zeros( 26 , dtype = np. int )
# 'start' index of the
# current substring
start = 0
# To store the maximum length
maxLen = 0
n = len ( str )
# Traverse the 'str'
for i in range ( 0 , n):
# Get the current character
# as 'ch'
ch = str [i]
# Increase frequency of
# 'ch' in 'freq[]'
freq[ ord (ch) - ord ( 'a' ) ] + = 1
# If frequency of 'ch'
# becomes more than 'k'
if (freq[ ord (ch) - ord ( 'a' )] > k):
# update 'maxLen'
if (maxLen < (i - start)):
maxLen = i - start
# decrease frequency of
# each character as they
# are encountered from
# the 'start' index until
# frequency of 'ch' is
# greater than 'k'
while (freq[ ord (ch) - ord ( 'a' )] > k):
# decrement frequency
# by '1'
freq[ ord ( str [start]) - ord ( 'a' )] - = 1
# increment 'start'
start = start + 1
# Update maxLen
if (maxLen < (n - start)):
maxLen = n - start
# required length
return maxLen;
# Driver Code
str = "babcaag"
k = 1
print ( "Length =" , longSub( str , k))
# This code is contributed by 'saloni1297'


C#

// C# implementation to find
// the length of the longest
// substring having frequency
// of each character less
// than equal to k
using System;
class GfG{
public static int SIZE = 26;
// function to find the length
// of the longest substring
// having frequency of each
// character less than equal
// to k
public static int longSubstring(String str1,
int k)
{
// hash table to store
// frequency of each table
int []freq = new int [SIZE];
char []str = str1.ToCharArray();
// 'start' index of the
// current substring
int start = 0;
// to store the maximum length
int maxLen = 0;
char ch;
int n = str1.Length;
// traverse the string 'str'
for ( int i = 0; i < n; i++)
{
// get the current character
// as 'ch'
ch = str[i];
// increase frequency of
// 'ch' in 'freq[]'
freq[ch - 'a' ]++;
// if frequency of 'ch'
// becomes more than 'k'
if (freq[ch - 'a' ] > k)
{
// update 'maxLen'
if (maxLen < (i - start))
maxLen = i - start;
// decrease frequency of
// each character as they
// are encountered from
// the 'start' index until
// frequency of 'ch' is
// greater than 'k'
while (freq[ch - 'a' ] > k)
{
// decrement frequency
// by '1'
freq[str[start] - 'a' ]--;
// increment 'start'
start++;
}
}
}
// update maxLen
if (maxLen < (n - start))
maxLen = n - start;
// required length
return maxLen;
}
// Driver function
public static void Main()
{
String str = "babcaag" ;
int k = 1;
Console.Write( "Length = " +
longSubstring(str, k));
}
}
// This code is contributed by nitin mittal


PHP

<?php
// PHP implementation to find
// the length of the longest
// sub$having frequency
// of each character less
// than equal to k
$SIZE = 26;
// function to find the length
// of the longest sub$
// having frequency of each
// character less than equal
// to k
function longSubstring( $str , $k )
{
global $SIZE ;
// hash table to
// store frequency
// of each table
$freq = array ();
// Initialize
for ( $i = 0; $i < $SIZE ; $i ++)
$freq [ $i ] = 0;
// 'start' index of
// the current substring
$start = 0;
// to store the
// maximum length
$maxLen = 0;
$ch = '' ;
$n = strlen ( $str );
// traverse the $'str'
for ( $i = 0; $i < $n ; $i ++)
{
// get the current
// character as 'ch'
$ch = $str [ $i ];
// increase frequency
// of 'ch' in 'freq[]'
$freq [ord( $ch ) -
ord( 'a' )]++;
// if frequency of
// 'ch' becomes
// more than 'k'
if ( $freq [ord( $ch ) -
ord( 'a' )] > $k )
{
// update 'maxLen'
if ( $maxLen < ( $i - $start ))
$maxLen = $i - $start ;
// decrease frequency of
// each character as they
// are encountered from
// the 'start' index until
// frequency of 'ch' is
// greater than 'k'
while ( $freq [ord( $ch ) -
ord( 'a' )] > $k )
{
// decrement frequency
// by '1'
$freq [ord( $str [ $start ]) -
ord( 'a' )]--;
// increment 'start'
$start ++;
}
}
}
// update maxLen
if ( $maxLen < ( $n - $start ))
$maxLen = $n - $start ;
// required length
return $maxLen ;
}
// Driver Code
$str = "babcaag" ;
$k = 1;
echo ( "Length = " .
longSubstring( $str , $k ));
// This code is contributed by
// Manish Shaw(manishshaw1)
?>


Javascript

<script>
// JavaScript implementation to find
// the length of the longest
// substring having frequency
// of each character less
// than equal to k
var SIZE = 26;
// function to find the length
// of the longest substring
// having frequency of each
// character less than equal
// to k
function longSubstring(str, k)
{
// hash table to store frequency
// of each table
var freq = Array(SIZE).fill(0);
// 'start' index of the current
// substring
var start = 0;
// to store the maximum length
var maxLen = 0;
var ch;
var n = str.length;
// traverse the string 'str'
for ( var i = 0; i < n; i++)
{
// get the current character
// as 'ch'
ch = str[i];
// increase frequency of
// 'ch' in 'freq[]'
freq[ch.charCodeAt(0) -
'a' .charCodeAt(0)]++;
// if frequency of 'ch' becomes
// more than 'k'
if (freq[ch.charCodeAt(0) -
'a' .charCodeAt(0)] > k)
{
// update 'maxLen'
if (maxLen < (i - start))
maxLen = i - start;
// decrease frequency of
// each character as they
// are encountered from
// the 'start' index until
// frequency of 'ch' is
// greater than 'k'
while (freq[ch.charCodeAt(0) -
'a' .charCodeAt(0)] > k)
{
// decrement frequency
// by '1'
freq[str[start].charCodeAt(0) -
'a' .charCodeAt(0)]--;
// increment 'start'
start++;
}
}
}
// update maxLen
if (maxLen < (n - start))
maxLen = n - start;
// required length
return maxLen;
}
// Driver program to test above
var str = "babcaag" ;
var k = 1;
document.write( "Length = "
+ longSubstring(str, k));
</script>


输出:

Length = 3

时间复杂性: O(n)。 辅助空间: O(1)。 由于while循环,复杂性可能看起来是二次的,但如果我们仔细观察内部while循环,它只会遍历字符串一次。”

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享