📌  相关文章
📜  下一个不包含回文且具有前 k 个字符的单词

📅  最后修改于: 2022-05-13 01:57:06.847000             🧑  作者: Mango

下一个不包含回文且具有前 k 个字符的单词

给定一个字符串和一个限制 k,按字典顺序查找下一个单词,该单词包含一组英文字母表的前 K 个字母中的字符,并且不包含回文,因为它是长度大于一个的子字符串。可以假设输入字符串不包含回文子字符串。
例子:

Input : s = "cba" 
        k = 4
Output : cbd

Input : s = "cba"
        k = 3
Output : -1
we can't form such word

方法:我们的目标是按字典顺序排列下一个单词,因此,我们需要从右向左移动。从右到左遍历时,从右更改最后一个字母。在递增最后一个字母时,确保形成的字符串包含前 k 个字母,并且不包含任何子字符串作为回文。
下面是上述方法的实现:

C++
// CPP program to find lexicographically
// next word which contains first K
// letters of the English alphabet
// and does not contain a palindrome
// as it's substring of length more
// than one.
#include 
using namespace std;
 
// function to return lexicographically
// next word
void findNextWord(string s, int m)
{
    // we made m as m+97 that means
    // our required string contains
    // not more than m+97(as per ASCII
    // value) in it.
    m += 97;
    int n = s.length();
    int i = s.length() - 1;
     
    // increment last alphabet to make
    // next lexicographically next word.
    s[i]++;
 
    while (i >= 0 && i <= n - 1) {
         
        // if i-th alphabet not in first
        // k letters then make it as "a"
        // and then increase (i-1)th letter
        if (s[i] >= m) {
            s[i] = 'a';
            s[--i]++;
        }
 
        // to check whether formed string
        // palindrome or not.
        else if (s[i] == s[i - 1] ||
                 s[i] == s[i - 2])
            s[i]++;
 
        // increment i.
        else
            i++;
    }
 
    // if i less than or equals to one
    // that means we not formed such word.
    if (i <= -1)
        cout << "-1";
    else
        cout << s;
}
 
// Driver code for above function.
int main()
{
    string str = "abcd";
    int k = 4;
    findNextWord(str, k);
    return 0;
}


Java
// Java program to find lexicographically
// next word which contains first K
// letters of the English alphabet
// and does not contain a palindrome
// as it's substring of length more
// than one.
 
public class GFG
{
 
    // function to return lexicographically
    // next word
    static void findNextWord(char[] s, int m)
    {
        // we made m as m+97 that means
        // our required string contains
        // not more than m+97(as per ASCII
        // value) in it.
        m += 97;
        int n = s.length;
        int i = s.length - 1;
 
        // increment last alphabet to make
        // next lexicographically next word.
        s[i]++;
 
        while (i >= 0 && i <= n - 1)
        {
 
            // if i-th alphabet not in first
            // k letters then make it as "a"
            // and then increase (i-1)th letter
            if (s[i] >= m)
            {
                s[i] = 'a';
                s[--i]++;
            }
            // to check whether formed string
            // palindrome or not.
            else if (s[i] == s[i - 1]
                    || s[i] == s[i - 2])
            {
                s[i]++;
            }
            // increment i.
            else
            {
                i++;
            }
        }
 
        // if i less than or equals to one
        // that means we not formed such word.
        if (i <= -1)
        {
            System.out.println("-1");
        }
        else
        {
            System.out.println(s);
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        char[] str = "abcd".toCharArray();
        int k = 4;
        findNextWord(str, k);
    }
}
 
// This code contributed by Rajput-Ji


Python3
# Python3 program to find lexicographically
# next word which contains first K
# letters of the English alphabet and
# does not contain a palindrome as it's
# substring of length more than one.
 
# Function to return lexicographically next word
def findNextWord(s, m):
 
    # we made m as m+97 that means
    # our required string contains
    # not more than m+97(as per ASCII
    # value) in it.
    m += 97
    n = len(s)
    i = len(s) - 1
     
    # increment last alphabet to make
    # next lexicographically next word.
    s[i] = chr(ord(s[i]) + 1)
 
    while i >= 0 and i <= n - 1:
         
        # if i-th alphabet not in first
        # k letters then make it as "a"
        # and then increase (i-1)th letter
        if ord(s[i]) >= m:
            s[i] = 'a'
            i -= 1
            s[i] = chr(ord(s[i]) + 1)
 
        # to check whether formed string
        # palindrome or not.
        elif s[i] == s[i - 1] or s[i] == s[i - 2]:
            s[i] = chr(ord(s[i]) + 1)
 
        # increment i.
        else:
            i += 1
     
    # if i less than or equals to one
    # that means we not formed such word.
    if i <= -1:
        print("-1")
    else:
        print(''.join(s))
 
# Driver code
if __name__ == "__main__":
 
    string = "abcd"
    k = 4
    findNextWord(list(string), k)
 
# This code is contributed by Rituraj Jain


C#
// C# program to find lexicographically
// next word which contains first K
// letters of the English alphabet
// and does not contain a palindrome
// as it's substring of length more
// than one.
using System;
 
class GFG
{
 
    // function to return lexicographically
    // next word
    static void findNextWord(char[] s, int m)
    {
        // we made m as m+97 that means
        // our required string contains
        // not more than m+97(as per ASCII
        // value) in it.
        m += 97;
        int n = s.Length;
        int i = s.Length - 1;
 
        // increment last alphabet to make
        // next lexicographically next word.
        s[i]++;
 
        while (i >= 0 && i <= n - 1)
        {
 
            // if i-th alphabet not in first
            // k letters then make it as "a"
            // and then increase (i-1)th letter
            if (s[i] >= m)
            {
                s[i] = 'a';
                s[--i]++;
            }
            // to check whether formed string
            // palindrome or not.
            else if (s[i] == s[i - 1] ||
                     s[i] == s[i - 2])
            {
                s[i]++;
            }
             
            // increment i.
            else
            {
                i++;
            }
        }
 
        // if i less than or equals to one
        // that means we not formed such word.
        if (i <= -1)
        {
            Console.WriteLine("-1");
        }
        else
        {
            Console.WriteLine(s);
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        char[] str = "abcd".ToCharArray();
        int k = 4;
        findNextWord(str, k);
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:

abda