📌  相关文章
📜  给定一个字符串和一个整数k,根据给定条件对所有子字符串进行排序时,找到第k个子字符串

📅  最后修改于: 2021-04-27 22:12:36             🧑  作者: Mango

给定一个字符串str ,其子字符串的形成方式是,以该字符串的第一个字符开头的所有子字符串将按其长度的排序顺序首先出现,然后是所有以第二个字符开头的子字符串字符串的字符,按其长度的排序顺序等。
例如,对于字符串abc ,其子字符串按要求的顺序为aababcbbcc
现在给定整数k ,任务是按所需顺序查找第k个子字符串

例子:

方法:想法是使用二进制搜索。数组子字符串将用于存储以ith字符+ substring [i – 1]开头的子字符串的数量。现在,对数组子字符串使用二进制搜索,找到所需子字符串的起始索引,然后以end = length_of_string –(substring [start] – k)查找同一子字符串的结束索引

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to prints kth sub-string
void Printksubstring(string str, int n, int k)
{
  
    // Total sub-strings possible
    int total = (n * (n + 1)) / 2;
  
    // If k is greater than total
    // number of sub-strings
    if (k > total) {
        printf("-1\n");
        return;
    }
  
    // To store number of sub-strings starting
    // with ith character of the string
    int substring[n + 1];
    substring[0] = 0;
  
    // Compute the values
    int temp = n;
    for (int i = 1; i <= n; i++) {
  
        // substring[i - 1] is added
        // to store the cumulative sum
        substring[i] = substring[i - 1] + temp;
        temp--;
    }
  
    // Binary search to find the starting index
    // of the kth sub-string
    int l = 1;
    int h = n;
    int start = 0;
  
    while (l <= h) {
        int m = (l + h) / 2;
  
        if (substring[m] > k) {
            start = m;
            h = m - 1;
        }
  
        else if (substring[m] < k)
            l = m + 1;
  
        else {
            start = m;
            break;
        }
    }
  
    // To store the ending index of
    // the kth sub-string
    int end = n - (substring[start] - k);
  
    // Print the sub-string
    for (int i = start - 1; i < end; i++)
        cout << str[i];
}
  
// Driver code
int main()
{
    string str = "abc";
    int k = 4;
    int n = str.length();
  
    Printksubstring(str, n, k);
  
    return 0;
}


Java
// Java implementation of the approach
  
class GFG 
{
  
    // Function to prints kth sub-string
    static void Printksubstring(String str, int n, int k) 
    {
  
        // Total sub-strings possible
        int total = (n * (n + 1)) / 2;
  
        // If k is greater than total
        // number of sub-strings
        if (k > total)
        {
            System.out.printf("-1\n");
            return;
        }
  
        // To store number of sub-strings starting
        // with ith character of the string
        int substring[] = new int[n + 1];
        substring[0] = 0;
  
        // Compute the values
        int temp = n;
        for (int i = 1; i <= n; i++)
        {
  
            // substring[i - 1] is added
            // to store the cumulative sum
            substring[i] = substring[i - 1] + temp;
            temp--;
        }
  
        // Binary search to find the starting index
        // of the kth sub-string
        int l = 1;
        int h = n;
        int start = 0;
  
        while (l <= h) 
        {
            int m = (l + h) / 2;
  
            if (substring[m] > k)
            {
                start = m;
                h = m - 1;
            } 
            else if (substring[m] < k) 
            {
                l = m + 1;
            } 
            else
            {
                start = m;
                break;
            }
        }
  
        // To store the ending index of
        // the kth sub-string
        int end = n - (substring[start] - k);
  
        // Print the sub-string
        for (int i = start - 1; i < end; i++)
        {
            System.out.print(str.charAt(i));
        }
    }
  
    // Driver code
    public static void main(String[] args)
    {
  
        String str = "abc";
        int k = 4;
        int n = str.length();
  
        Printksubstring(str, n, k);
    }
}
  
// This code has been contributed by 29AjayKumar


Python3
# Python3 implementation of the approach
  
# Function to prints kth sub-string
def Printksubstring(str1, n, k):
      
    # Total sub-strings possible
    total = int((n * (n + 1)) / 2)
  
    # If k is greater than total
    # number of sub-strings
    if (k > total):
        print("-1")
        return
  
    # To store number of sub-strings starting
    # with ith character of the string
    substring = [0 for i in range(n + 1)]
    substring[0] = 0
  
    # Compute the values
    temp = n
    for i in range(1, n + 1, 1):
          
        # substring[i - 1] is added
        # to store the cumulative sum
        substring[i] = substring[i - 1] + temp
        temp -= 1
  
    # Binary search to find the starting index
    # of the kth sub-string
    l = 1
    h = n
    start = 0
  
    while (l <= h):
        m = int((l + h) / 2)
  
        if (substring[m] > k):
            start = m
            h = m - 1
  
        elif (substring[m] < k):
            l = m + 1
  
        else:
            start = m
            break
  
    # To store the ending index of
    # the kth sub-string
    end = n - (substring[start] - k)
  
    # Print the sub-string
    for i in range(start - 1, end):
        print(str1[i], end = "")
  
# Driver code
if __name__ == '__main__':
    str1 = "abc"
    k = 4
    n = len(str1)
  
    Printksubstring(str1, n, k)
      
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of the approach
using System;
  
class GFG 
{ 
  
    // Function to prints kth sub-string 
    static void Printksubstring(String str, int n, int k) 
    { 
  
        // Total sub-strings possible 
        int total = (n * (n + 1)) / 2; 
  
        // If k is greater than total 
        // number of sub-strings 
        if (k > total) 
        { 
            Console.Write("-1\n"); 
            return; 
        } 
  
        // To store number of sub-strings starting 
        // with ith character of the string 
        int []substring = new int[n + 1]; 
        substring[0] = 0; 
  
        // Compute the values 
        int temp = n; 
        for (int i = 1; i <= n; i++) 
        { 
  
            // substring[i - 1] is added 
            // to store the cumulative sum 
            substring[i] = substring[i - 1] + temp; 
            temp--; 
        } 
  
        // Binary search to find the starting index 
        // of the kth sub-string 
        int l = 1; 
        int h = n; 
        int start = 0; 
  
        while (l <= h) 
        { 
            int m = (l + h) / 2; 
  
            if (substring[m] > k) 
            { 
                start = m; 
                h = m - 1; 
            } 
            else if (substring[m] < k) 
            { 
                l = m + 1; 
            } 
            else
            { 
                start = m; 
                break; 
            } 
        } 
  
        // To store the ending index of 
        // the kth sub-string 
        int end = n - (substring[start] - k); 
  
        // Print the sub-string 
        for (int i = start - 1; i < end; i++) 
        { 
            Console.Write(str[i]); 
        } 
    } 
  
    // Driver code 
    public static void Main(String[] args) 
    { 
  
        String str = "abc"; 
        int k = 4; 
        int n = str.Length; 
  
        Printksubstring(str, n, k); 
    } 
} 
  
// This code contributed by Rajput-Ji


PHP
 $total)
    { 
        printf("-1\n"); 
        return; 
    } 
  
    // To store number of sub-strings starting 
    // with ith character of the string 
    $substring = array(); 
    $substring[0] = 0; 
  
    // Compute the values 
    $temp = $n; 
    for ($i = 1; $i <= $n; $i++)
    { 
  
        // substring[i - 1] is added 
        // to store the cumulative sum 
        $substring[$i] = $substring[$i - 1] + $temp; 
        $temp--; 
    } 
  
    // Binary search to find the starting index 
    // of the kth sub-string 
    $l = 1; 
    $h = $n; 
    $start = 0; 
  
    while ($l <= $h)
    { 
        $m = floor(($l + $h) / 2); 
  
        if ($substring[$m] > $k)
        { 
            $start = $m; 
            $h = $m - 1; 
        } 
  
        else if ($substring[$m] < $k) 
            $l = $m + 1; 
  
        else
        { 
            $start = $m; 
            break; 
        } 
    } 
  
    // To store the ending index of 
    // the kth sub-string 
    $end = $n - ($substring[$start] - $k); 
  
    // Print the sub-string 
    for ($i = $start - 1; $i < $end; $i++) 
        print($str[$i]); 
}
  
// Driver code 
$str = "abc"; 
$k = 4; 
$n = strlen($str);
  
Printksubstring($str, $n, $k); 
  
// This code is contributed by Ryuga
?>


输出:
b