📌  相关文章
📜  一个字符串,该字符串的各字符显示在一个子串的最大分区

📅  最后修改于: 2021-10-26 07:02:17             🧑  作者: Mango

给定一个字符串S ,将给定的字符串分成尽可能多的子字符串,这样给定字符串中的每个字符出现在一个子字符串中,并打印所有这些可能的部分。任务是打印这些子字符串。

例子:

处理方法:按照以下步骤解决问题:

  1. 存储字符串中所有字符出现的最后一个索引。
  2. 由于字符串仅包含小写字母,因此只需使用固定大小26的数组来存储每个字符的最后索引。
  3. 初始化一个空字符串ans = “”并迭代给定的字符串并按照以下步骤操作:
    • 当前字符添加到字符串ANS如果字符的最后位置比当前索引,并增加分区的长度。
    • 如果当前字符的最后位置等于当前索引,则打印ans 中存储的当前字符串,并将ans初始化为“”,用于存储字符串的下一个分区。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to print all the substrings
void print_substring(string s)
{
    int n = s.size();
 
    // Stores the substrings
    string str = "";
 
    // Stores last index of
    // characters of string s
    vector ans;
 
    if (n == 0) {
        cout << "-1";
        return;
    }
 
    // Find the last position of
    // each character in the string
    vector last_pos(26, -1);
 
    for (int i = n - 1; i >= 0; --i) {
 
        // Update the last index
        if (last_pos[s[i] - 'a'] == -1) {
            last_pos[s[i] - 'a'] = i;
        }
    }
 
    int minp = -1;
 
    // Iterate the given string
    for (int i = 0; i < n; ++i) {
 
        // Get the last index of s[i]
        int lp = last_pos[s[i] - 'a'];
 
        // Extend the current partition
        // characters last pos
        minp = max(minp, lp);
 
        // If the current pos of
        // character equals the min pos
        // then the end of partition
        if (i == minp) {
 
            // Add the respective character first
            str += s[i];
 
            // Store the partition's
            // len and reset variables
            cout << str << ' ';
 
            // Update the minp and str
            minp = -1;
            str = "";
        }
        else {
            str += s[i];
        }
    }
}
 
// Driver Code
int main()
{
    // Input string
    string S = "ababcbacadefegdehijhklij";
 
    // Function call
    print_substring(S);
 
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG {
 
    // Function to print all the substrings
    public static void print_substring(String s)
    {
        int n = s.length();
 
        // Stores the substrings
        String str = "";
 
        // Stores last index of
        // characters of string s
        Vector ans = new Vector();
 
        if (n == 0) {
            System.out.print("-1");
            return;
        }
 
        // Find the last position of
        // each character in the string
        int[] last_pos = new int[26];
        Arrays.fill(last_pos, -1);
 
        for (int i = n - 1; i >= 0; --i) {
 
            // Update the last index
            if (last_pos[s.charAt(i) - 'a'] == -1) {
                last_pos[s.charAt(i) - 'a'] = i;
            }
        }
 
        int minp = -1;
 
        // Iterate the given string
        for (int i = 0; i < n; ++i) {
 
            // Get the last index of s[i]
            int lp = last_pos[s.charAt(i) - 'a'];
 
            // Extend the current partition
            // characters last pos
            minp = Math.max(minp, lp);
 
            // If the current pos of
            // character equals the min pos
            // then the end of partition
            if (i == minp) {
                 
                // Add the respective character first
                str += s.charAt(i);
 
                // Store the partition's
                // len and reset variables
                System.out.print(str + ' ');
 
                // Update the minp and str
                minp = -1;
                str = "";
            }
            else {
                str += s.charAt(i);
            }
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        // Input string
        String S = "ababcbacadefegdehijhklij";
 
        // Function call
        print_substring(S);
    }
}
 
// This code is contributed by divyeshrabadiya07


Python3
# Python3 program for the above approach
 
# Function to print all the substrings
def print_substring(s):
 
    n = len(s)
 
    # Stores the substrings
    str = ""
 
    # Stores last index of
    # characters of string s
    ans = []
 
    if (n == 0):
        print("-1")
        return
 
    # Find the last position of
    # each character in the string
    last_pos = [-1] * 26
 
    for i in range(n - 1, -1, -1):
 
        # Update the last index
        if (last_pos[ord(s[i]) - ord('a')] == -1):
            last_pos[ord(s[i]) - ord('a')] = i
 
    minp = -1
 
    # Iterate the given string
    for i in range(n):
 
        # Get the last index of s[i]
        lp = last_pos[ord(s[i]) - ord('a')]
 
        # Extend the current partition
        # characters last pos
        minp = max(minp, lp)
 
        # If the current pos of
        # character equals the min pos
        # then the end of partition
        if (i == minp):
               
            #Add the respective character to the string
            str += s[i]
             
            # Store the partition's
            # len and reset variables
            print(str, end = " ")
 
            # Update the minp and str
            minp = -1
            str = ""
 
        else:
            str += s[i]
 
# Driver Code
 
# Input string
S = "ababcbacadefegdehijhklij"
 
# Function call
print_substring(S)
 
# This code is contributed by Shivam Singh


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
     
// Function to print all the substrings
public static void print_substring(String s)
{
    int n = s.Length;
 
    // Stores the substrings
    String str = "";
 
    // Stores last index of
    // characters of string s
    //List ans = new List();
 
    if (n == 0)
    {
        Console.Write("-1");
        return;
    }
 
    // Find the last position of
    // each character in the string
    int[] last_pos = new int[26];
    for(int i = 0; i < 26; i++)
        last_pos[i] = -1;
 
    for(int i = n - 1; i >= 0; --i)
    {
         
        // Update the last index
        if (last_pos[s[i] - 'a'] == -1)
        {
            last_pos[s[i] - 'a'] = i;
        }
    }
 
    int minp = -1;
 
    // Iterate the given string
    for(int i = 0; i < n; ++i)
    {
         
        // Get the last index of s[i]
        int lp = last_pos[s[i] - 'a'];
 
        // Extend the current partition
        // characters last pos
        minp = Math.Max(minp, lp);
 
        // If the current pos of
        // character equals the min pos
        // then the end of partition
        if (i == minp)
        {
            //Add respective character to the string 
            str += s[i];
           
            // Store the partition's
            // len and reset variables
            Console.Write(str + ' ');
 
            // Update the minp and str
            minp = -1;
            str = "";
        }
        else
        {
            str += s[i];
        }
    }
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Input string
    String S = "ababcbacadefegdehijhklij";
 
    // Function call
    print_substring(S);
}
}
 
// This code is contributed by Amit Katiyar


Javascript


输出
ababcbaca defegde hijhklij 

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

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