给定字符串str ,任务是找到最大长度K ,以便存在两个子序列A和B,每个子序列的长度为K ,使得A = B,并且A和B之间的公共索引数最多为K – 1 。
例子:
Input: str = “geeksforgeeks”
Output: 12
The two subsequences are
str[0…1] + str[3…12] = “geksforgeeks”
and str[0] + str[2…12] = “geksforgeeks”.
Input: str = “abcddefg”
Output: 7
方法:找到任意一对相同的字母,并且它们之间的最小字母数可以说这个最小数字为X ,现在问题的答案是len(str)–(X + 1) 。 X中加一个,不计入一对中的一个字母。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
const int MAX = 26;
// Function to return the required
// length of the subsequences
int maxLength(string str, int len)
{
// To store the result
int res = 0;
// To store the last visited
// position of lowercase letters
int lastPos[MAX];
// Initialisation of frequency array to -1 to
// indicate no character has previously occured
for (int i = 0; i < MAX; i++) {
lastPos[i] = -1;
}
// For every character of the string
for (int i = 0; i < len; i++) {
// Get the index of the current character
int C = str[i] - 'a';
// If the current character has
// appeared before in the string
if (lastPos[C] != -1) {
// Update the result
res = max(len - (i - lastPos[C] - 1) - 1, res);
}
// Update the last position
// of the current character
lastPos[C] = i;
}
return res;
}
// Driver code
int main()
{
string str = "geeksforgeeks";
int len = str.length();
cout << maxLength(str, len);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
static int MAX = 26;
// Function to return the required
// length of the subsequences
static int maxLength(String str, int len)
{
// To store the result
int res = 0;
// To store the last visited
// position of lowercase letters
int lastPos[] = new int[MAX];
// Initialisation of frequency array to -1 to
// indicate no character has previously occured
for (int i = 0; i < MAX; i++)
{
lastPos[i] = -1;
}
// For every character of the String
for (int i = 0; i < len; i++)
{
// Get the index of the current character
int C = str.charAt(i) - 'a';
// If the current character has
// appeared before in the String
if (lastPos[C] != -1)
{
// Update the result
res = Math.max(len - (i -
lastPos[C] - 1) - 1, res);
}
// Update the last position
// of the current character
lastPos[C] = i;
}
return res;
}
// Driver code
public static void main(String args[])
{
String str = "geeksforgeeks";
int len = str.length();
System.out.println(maxLength(str, len));
}
}
// This code is contributed by Arnab Kundu
Python3
# Python implementation of the approach
MAX = 26;
# Function to return the required
# length of the subsequences
def maxLength(str, len):
# To store the result
res = 0;
# To store the last visited
# position of lowercase letters
lastPos = [0] * MAX;
# Initialisation of frequency array to -1 to
# indicate no character has previously occured
for i in range(MAX):
lastPos[i] = -1;
# For every character of the String
for i in range(len):
# Get the index of the current character
C = ord(str[i]) - ord('a');
# If the current character has
# appeared before in the String
if (lastPos[C] != -1):
# Update the result
res = max(len - (i - lastPos[C] - 1) - 1, res);
# Update the last position
# of the current character
lastPos[C] = i;
return res;
# Driver code
if __name__ == '__main__':
str = "geeksforgeeks";
len = len(str);
print(maxLength(str, len));
# This code is contributed by 29AjayKumar
C#
// C# implementation of the approach
using System;
class GFG
{
static int MAX = 26;
// Function to return the required
// length of the subsequences
static int maxLength(string str, int len)
{
// To store the result
int res = 0;
// To store the last visited
// position of lowercase letters
int []lastPos = new int[MAX];
// Initialisation of frequency array to -1 to
// indicate no character has previously occured
for (int i = 0; i < MAX; i++)
{
lastPos[i] = -1;
}
// For every character of the String
for (int i = 0; i < len; i++)
{
// Get the index of the current character
int C = str[i] - 'a';
// If the current character has
// appeared before in the String
if (lastPos[C] != -1)
{
// Update the result
res = Math.Max(len - (i -
lastPos[C] - 1) - 1, res);
}
// Update the last position
// of the current character
lastPos[C] = i;
}
return res;
}
// Driver code
public static void Main()
{
string str = "geeksforgeeks";
int len = str.Length;
Console.WriteLine(maxLength(str, len));
}
}
// This code is contributed by AnkitRai01
输出:
12
时间复杂度: O(n),其中n是输入字符串的长度。