📌  相关文章
📜  通过删除相同字符的后缀和前缀来最小化字符串的长度

📅  最后修改于: 2021-10-25 06:23:45             🧑  作者: Mango

给定一个长度为N的字符串S仅由字符‘a’‘b’‘c’ 组成,任务是通过只执行一次以下操作来最小化给定字符串的长度:

  • 将字符串分成两个非空子字符串,然后将左子字符串附加到右子字符串的末尾。
  • 追加时,如果右子串的后缀和左子串的前缀包含相同的字符,则分别从右子串和左子串的后缀和前缀中删除这些字符。重复此步骤,直到没有不可删除的子字符串。

例子:

方法:给定的问题可以通过使用两个指针通过寻找类似的字符出现在字符串的后缀和字符串的前缀来解决。
请按照以下步骤解决问题:

  • 初始化两个变量,比如i0j(N – 1)
  • 迭代一个循环,直到i < j且字符S[i]S[j]相同,执行以下步骤:
    • S[i]初始化一个变量,比如d ,然后将指针i向右移动,而i至多是j并且d = S[i]
    • 将指针j向左移动,直到i至多为jd = S[j]
  • 完成上述步骤后, (j – i + 1)的值就是字符串的最小可能长度。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include
using namespace std;
 
// Function to find the minimum length
// of the string after removing the same
// characters from the end and front of the
// two strings after dividing into 2 substrings
int minLength(string s)
{
     
    // Initialize two pointers
    int i = 0, j = s.length() - 1;
 
    // Traverse the string S
    for(; i < j && s[i] == s[j];)
    {
         
        // Current char on left pointer
        char d = s[i];
 
        // Shift i towards right
        while (i <= j && s[i] == d)
            i++;
 
        // Shift j towards left
        while (i <= j && s[j] == d)
            j--;
    }
 
    // Return the minimum possible
    // length of string
    return j - i + 1;
}
 
// Driver Code
int main()
{
    string S = "aacbcca";
     
    cout << minLength(S);
}
 
// This code is contributed by bgangwar59


Java
// Java program for the above approach
 
import java.lang.*;
import java.util.*;
 
class GFG {
 
    // Function to find the minimum length
    // of the string after removing the same
    // characters from the end and front of the
    // two strings after dividing into 2 substrings
    static int minLength(String s)
    {
        // Initialize two pointers
        int i = 0, j = s.length() - 1;
 
        // Traverse the string S
        for (; i < j
               && s.charAt(i) == s.charAt(j);) {
 
            // Current char on left pointer
            char d = s.charAt(i);
 
            // Shift i towards right
            while (i <= j
                   && s.charAt(i) == d)
                i++;
 
            // Shift j towards left
            while (i <= j
                   && s.charAt(j) == d)
                j--;
        }
 
        // Return the minimum possible
        // length of string
        return j - i + 1;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        String S = "aacbcca";
        System.out.println(minLength(S));
    }
}


Python3
# Python3 program for the above approach
 
# Function to find the minimum length
# of the string after removing the same
# characters from the end and front of the
# two strings after dividing into 2 substrings
def minLength(s):
 
    # Initialize two pointers
    i = 0; j = len(s) - 1
 
    # Traverse the string S
    while (i < j and s[i] == s[j]):
         
        # Current char on left pointer
        d = s[i]
 
        # Shift i towards right
        while (i <= j and s[i] == d):
            i += 1
 
        # Shift j towards left
        while (i <= j and s[j] == d):
            j -= 1
 
    # Return the minimum possible
    # length of string
    return j - i + 1
 
# Driver Code
if __name__ == "__main__" :
 
    S = "aacbcca"
     
    print(minLength(S))
 
# This code is contributed by AnkThon


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Function to find the minimum length
// of the string after removing the same
// characters from the end and front of the
// two strings after dividing into 2 substrings
static int minLength(string s)
{
     
    // Initialize two pointers
    int i = 0, j = s.Length - 1;
 
    // Traverse the string S
    for(; i < j && s[i] == s[j];)
    {
         
        // Current char on left pointer
        char d = s[i];
 
        // Shift i towards right
        while (i <= j && s[i] == d)
            i++;
 
        // Shift j towards left
        while (i <= j && s[j] == d)
            j--;
    }
 
    // Return the minimum possible
    // length of string
    return j - i + 1;
}
 
// Driver Code
public static void Main(string[] args)
{
    string S = "aacbcca";
     
    Console.WriteLine(minLength(S));
}
}
 
// This code is contributed by AnkThon


Javascript


输出:
1

时间复杂度: O(N)
辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程