# Check if characters of a string can be made non-decreasing by replacing ‘?’s

• Last Updated : 18 Jun, 2021

Given a string S of length N consisting of lowercase English alphabets and ‘?’, the task is to check if it is possible to make the string non-decreasing by replacing all the ‘?’ characters with English alphabets. If found to be true, print “Yes”. Otherwise, print “No”.

Examples:

Input: S = “abb?xy?”
Output: Yes
Explanation:
Replacing the ‘?’s at index 3 and 6 with ‘b’ and ‘z’, modifies the string S to “abbbxyz”, which is non-decreasing.

Input: S = “??z?a?”
Output : No

Naive Approach: The simplest approach to solve the problem is to generate all possible strings using English alphabets and check if the resulting string is non-decreasing or not. If found to be true, print “Yes”, Otherwise, print “No”.

Time Complexity: O(N*26N)
Auxiliary Space: O(N)

Efficient Approach: The given problem can be solved based on the following observations:

• It can be observed that the only position that matters is the position with S[i]! = ‘?’, as one can replace the ‘?’ with the character at the nearest index that is not ‘?’
• Therefore, the task is reduced to checking if characters of the strings that are not ‘?’, are in non-decreasing order or not.

Follow the steps below to solve the problem:

• Initialize a variable, say last, to store the last character which is not a ‘?’.
• Traverse the string and for every ith character, check if S[i]! = ‘?’ and S[i]<last, then print “No”
• Otherwise, update last as last = S[i] if S[i]!=’?’.
• Print “Yes” if none of the above cases are satisfied.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach` `#include ``using` `namespace` `std;` `// Function to check if it's possible``// to make the string s non decreasing``int` `nonDecreasing(string s)``{``    ``// Stores length of string``    ``int` `size = s.length();` `    ``// Stores the last character``    ``// that is not '?'``    ``char` `c = ``'a'``;` `    ``// Traverse the string S``    ``for` `(``int` `i = 0; i < size; i++) {` `        ``// If current character``        ``// of the string is '?'``        ``if` `(s[i] == ``'?'``) {``            ``continue``;``        ``}` `        ``// If s[i] is not '?'``        ``// and is less than C``        ``else` `if` `((s[i] != ``'?'``)``                 ``&& (s[i] < c)) {` `            ``return` `0;``        ``}` `        ``// Otherwise``        ``else` `{` `            ``// Update C``            ``c = s[i];``        ``}``    ``}` `    ``// Return 1``    ``return` `1;``}` `// Driver Code``int` `main()``{``    ``string S = ``"abb?xy?"``;` `    ``if` `(nonDecreasing(S))``        ``cout << ``"Yes"` `<< endl;``    ``else``        ``cout << ``"No"` `<< endl;` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG``{` `// Function to check if it's possible``// to make the String s non decreasing``static` `int` `nonDecreasing(``char` `[]s)``{``  ` `    ``// Stores length of String``    ``int` `size = s.length;` `    ``// Stores the last character``    ``// that is not '?'``    ``char` `c = ``'a'``;` `    ``// Traverse the String S``    ``for` `(``int` `i = ``0``; i < size; i++)``    ``{` `        ``// If current character``        ``// of the String is '?'``        ``if` `(s[i] == ``'?'``)``        ``{``            ``continue``;``        ``}` `        ``// If s[i] is not '?'``        ``// and is less than C``        ``else` `if` `((s[i] != ``'?'``)``                 ``&& (s[i] < c))``        ``{` `            ``return` `0``;``        ``}` `        ``// Otherwise``        ``else` `{` `            ``// Update C``            ``c = s[i];``        ``}``    ``}` `    ``// Return 1``    ``return` `1``;``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``String S = ``"abb?xy?"``;` `    ``if` `(nonDecreasing(S.toCharArray())==``1``)``        ``System.out.print(``"Yes"` `+``"\n"``);``    ``else``        ``System.out.print(``"No"` `+``"\n"``);` `}``}` `// This code is contributed by 29AjayKumar`

## Python3

 `# python 3 program for the above approach` `# Function to check if it's possible``# to make the string s non decreasing``def` `nonDecreasing(s):``  ` `    ``# Stores length of string``    ``size ``=` `len``(s)` `    ``# Stores the last character``    ``# that is not '?'``    ``c ``=` `'a'` `    ``# Traverse the string S``    ``for` `i ``in` `range``(size):``      ` `        ``# If current character``        ``# of the string is '?'``        ``if` `(s[i] ``=``=` `'?'``):``            ``continue` `        ``# If s[i] is not '?'``        ``# and is less than C``        ``elif``((s[i] !``=` `'?'``) ``and` `(s[i] < c)):``            ``return` `0` `        ``# Otherwise``        ``else``:``          ` `            ``# Update C``            ``c ``=` `s[i]` `    ``# Return 1``    ``return` `1` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``S ``=` `"abb?xy?"` `    ``if``(nonDecreasing(S)):``        ``print``(``"Yes"``)``    ``else``:``        ``print``(``"No"``)``        ` `        ``# This code is contributed by SURENDRA_GANGWAR.`

## C#

 `// C# program for the above approach``using` `System;` `public` `class` `GFG``{` `  ``// Function to check if it's possible``  ``// to make the String s non decreasing``  ``static` `int` `nonDecreasing(``char` `[]s)``  ``{` `    ``// Stores length of String``    ``int` `size = s.Length;` `    ``// Stores the last character``    ``// that is not '?'``    ``char` `c = ``'a'``;` `    ``// Traverse the String S``    ``for` `(``int` `i = 0; i < size; i++)``    ``{` `      ``// If current character``      ``// of the String is '?'``      ``if` `(s[i] == ``'?'``)``      ``{``        ``continue``;``      ``}` `      ``// If s[i] is not '?'``      ``// and is less than C``      ``else` `if` `((s[i] != ``'?'``)``               ``&& (s[i] < c))``      ``{` `        ``return` `0;``      ``}` `      ``// Otherwise``      ``else` `{` `        ``// Update C``        ``c = s[i];``      ``}``    ``}` `    ``// Return 1``    ``return` `1;``  ``}` `  ``// Driver Code``  ``public` `static` `void` `Main(String[] args)``  ``{``    ``String S = ``"abb?xy?"``;` `    ``if` `(nonDecreasing(S.ToCharArray())==1)``      ``Console.Write(``"Yes"` `+``"\n"``);``    ``else``      ``Console.Write(``"No"` `+``"\n"``);` `  ``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``

Output:

`Yes`

Time Complexity: O(N)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up