Anhand einer Eingabezeichenfolge und eines Musters wird überprüft, ob die Zeichen in der Eingabezeichenfolge derselben Reihenfolge folgen, die durch die im Muster vorhandenen Zeichen bestimmt wird. Gehen Sie davon aus, dass das Muster keine doppelten Zeichen enthält.
Eine weitere Lösung für das gleiche Problem wird veröffentlicht Hier .
Beispiele:
Input: string = 'engineers rock' pattern = 'er'; Output: true All 'e' in the input string are before all 'r'. Input: string = 'engineers rock' pattern = 'egr'; Output: false There are two 'e' after 'g' in the input string. Input: string = 'engineers rock' pattern = 'gsr'; Output: false There are one 'r' before 's' in the input string.
Die Idee hier ist, die gegebene Zeichenfolge auf das gegebene Muster zu reduzieren. Für im Muster angegebene Zeichen behalten wir nur die entsprechenden Zeichen im String bei. In der neuen Zeichenfolge löschen wir fortlaufend wiederholte Zeichen. Die geänderte Zeichenfolge sollte dann dem angegebenen Muster entsprechen. Zuletzt vergleichen wir die geänderte Zeichenfolge mit dem angegebenen Muster und geben entsprechend true oder false zurück.
Illustration:
str = 'bfbaeadeacc' pat[] = 'bac' 1) Remove extra characters from str (characters that are not present in pat[] str = 'bbaaacc' [f e and d are removed] 3) Removed consecutive repeating occurrences of characters str = 'bac' 4) Since str is same as pat[] we return true
Nachfolgend finden Sie die Umsetzung der oben genannten Schritte.
// C++ code for the above approach #include #include using namespace std; bool followsPattern(string str string pattern) { // Insert all characters of pattern in a hash set unordered_set<char> patternSet; for (int i = 0; i < pattern.length(); i++) { patternSet.insert(pattern[i]); } // Build modified string (string with characters only from pattern are taken) string modifiedStr = str; for (int i = str.length() - 1; i >= 0; i--) { if (patternSet.find(str[i]) == patternSet.end()) { modifiedStr.erase(i 1); } } // Remove more than one consecutive occurrences of pattern characters from modified string for (int i = modifiedStr.length() - 1; i > 0; i--) { if (modifiedStr[i] == modifiedStr[i - 1]) { modifiedStr.erase(i 1); } } // After above modifications the length of modified string must be same as pattern length if (pattern.length() != modifiedStr.length()) { return false; } // And pattern characters must also be same as modified string characters for (int i = 0; i < pattern.length(); i++) { if (pattern[i] != modifiedStr[i]) { return false; } } return true; } int main() { string str = 'engineers rock'; string pattern = 'er'; cout << 'Expected: true Actual: ' << followsPattern(str pattern) << endl; str = 'engineers rock'; pattern = 'egr'; cout << 'Expected: false Actual: ' << followsPattern(str pattern) << endl; str = 'engineers rock'; pattern = 'gsr'; cout << 'Expected: false Actual: ' << followsPattern(str pattern) << endl; str = 'engineers rock'; pattern = 'eger'; cout << 'Expected: true Actual: ' << followsPattern(str pattern) << endl; return 0; } // This code is contributed by adityashatmfh
Java // Java program to check if characters of a string follow // pattern defined by given pattern. import java.util.*; public class OrderOfCharactersForPattern { public static boolean followsPattern(String str String pattern) { // Insert all characters of pattern in a hash set Set<Character> patternSet = neHashSet<>(); for (int i=0; i<pattern.length(); i++) patternSet.add(pattern.charAt(i)); // Build modified string (string with characters only from // pattern are taken) StringBuilder modifiedString = new StringBuilder(str); for (int i=str.length()-1; i>=0; i--) if (!patternSet.contains(modifiedString.charAt(i))) modifiedString.deleteCharAt(i); // Remove more than one consecutive occurrences of pattern // characters from modified string. for (int i=modifiedString.length()-1; i>0; i--) if (modifiedString.charAt(i) == modifiedString.charAt(i-1)) modifiedString.deleteCharAt(i); // After above modifications the length of modified string // must be same as pattern length if (pattern.length() != modifiedString.length()) return false; // And pattern characters must also be same as modified string // characters for (int i=0; i<pattern.length(); i++) if (pattern.charAt(i) != modifiedString.charAt(i)) return false; return true; } // Driver program int main() { String str = 'engineers rock'; String pattern = 'er'; System.out.println('Expected: true Actual: ' + followsPattern(str pattern)); str = 'engineers rock'; pattern = 'egr'; System.out.println('Expected: false Actual: ' + followsPattern(str pattern)); str = 'engineers rock'; pattern = 'gsr'; System.out.println('Expected: false Actual: ' + followsPattern(str pattern)); str = 'engineers rock'; pattern = 'eger'; System.out.println('Expected: true Actual: ' + followsPattern(str pattern)); return 0; } }
Python3 # Python3 program to check if characters of # a string follow pattern defined by given pattern. def followsPattern(string pattern): # Insert all characters of pattern in a hash set patternSet = set() for i in range(len(pattern)): patternSet.add(pattern[i]) # Build modified string (string with characters # only from pattern are taken) modifiedString = string for i in range(len(string) - 1 -1 -1): if not modifiedString[i] in patternSet: modifiedString = modifiedString[:i] + modifiedString[i + 1:] # Remove more than one consecutive occurrences # of pattern characters from modified string. for i in range(len(modifiedString) - 1 0 -1): if modifiedString[i] == modifiedString[i - 1]: modifiedString = modifiedString[:i] + modifiedString[i + 1:] # After above modifications the length of # modified string must be same as pattern length if len(pattern) != len(modifiedString): return False # And pattern characters must also be same # as modified string characters for i in range(len(pattern)): if pattern[i] != modifiedString[i]: return False return True # Driver Code if __name__ == '__main__': string = 'engineers rock' pattern = 'er' print('Expected: true Actual:' followsPattern(string pattern)) string = 'engineers rock' pattern = 'egr' print('Expected: false Actual:' followsPattern(string pattern)) string = 'engineers rock' pattern = 'gsr' print('Expected: false Actual:' followsPattern(string pattern)) string = 'engineers rock' pattern = 'eger' print('Expected: true Actual:' followsPattern(string pattern)) # This code is contributed by # sanjeev2552
C# // C# program to check if characters of a string follow // pattern defined by given pattern. using System; using System.Collections.Generic; using System.Text; class GFG { public static bool followsPattern(String str String pattern) { // Insert all characters of pattern in a hash set HashSet<char> patternSet = new HashSet<char>(); for (int i = 0; i < pattern.Length; i++) patternSet.Add(pattern[i]); // Build modified string (string with characters // only from pattern are taken) StringBuilder modifiedString = new StringBuilder(str); for (int i = str.Length - 1; i >= 0; i--) if (!patternSet.Contains(modifiedString[i])) modifiedString.Remove(i 1); // Remove more than one consecutive occurrences of pattern // characters from modified string. for (int i = modifiedString.Length - 1; i > 0; i--) if (modifiedString[i] == modifiedString[i - 1]) modifiedString.Remove(i 1); // After above modifications the length of modified string // must be same as pattern length if (pattern.Length != modifiedString.Length) return false; // And pattern characters must also be same // as modified string characters for (int i = 0; i < pattern.Length; i++) if (pattern[i] != modifiedString[i]) return false; return true; } // Driver program public static void Main(String[] args) { String str = 'engineers rock'; String pattern = 'er'; Console.WriteLine('Expected: true Actual: ' + followsPattern(str pattern)); str = 'engineers rock'; pattern = 'egr'; Console.WriteLine('Expected: false Actual: ' + followsPattern(str pattern)); str = 'engineers rock'; pattern = 'gsr'; Console.WriteLine('Expected: false Actual: ' + followsPattern(str pattern)); str = 'engineers rock'; pattern = 'eger'; Console.WriteLine('Expected: true Actual: ' + followsPattern(str pattern)); } } // This code is contributed by 29AjayKumar
JavaScript <script> // Javascript program to check if characters of a string follow // pattern defined by given pattern. function followsPattern(str pattern) { // Insert all characters of pattern in a hash set let patternSet = new Set(); for (let i=0; i<pattern.length; i++) patternSet.add(pattern[i]); // Build modified string (string with characters only from // pattern are taken) let modifiedString = (str).split(''); for (let i=str.length-1; i>=0; i--) if (!patternSet.has(modifiedString[i])) modifiedString.splice(i1); // Remove more than one consecutive occurrences of pattern // characters from modified string. for (let i=modifiedString.length-1; i>0; i--) if (modifiedString[i] == modifiedString[i-1]) modifiedString.splice(i1); // After above modifications the length of modified string // must be same as pattern length if (pattern.length != modifiedString.length) return false; // And pattern characters must also be same as modified string // characters for (let i=0; i<pattern.length; i++) if (pattern[i] != modifiedString[i]) return false; return true; } // Driver program let str = 'engineers rock'; let pattern = 'er'; document.write('Expected: true Actual: ' + followsPattern(str pattern)+'
'); str = 'engineers rock'; pattern = 'egr'; document.write('Expected: false Actual: ' + followsPattern(str pattern)+'
'); str = 'engineers rock'; pattern = 'gsr'; document.write('Expected: false Actual: ' + followsPattern(str pattern)+'
'); str = 'engineers rock'; pattern = 'eger'; document.write('Expected: true Actual: ' + followsPattern(str pattern)+'
'); // This code is contributed by rag2127 </script>
Ausgabe:
Expected: true Actual: true Expected: false Actual: false Expected: false Actual: false Expected: true Actual: true
Zeitkomplexität: Die zeitliche Komplexität der oben genannten Implementierungen beträgt tatsächlich O(mn + n^2), da wir deleteCharAt() zum Entfernen von Zeichen verwenden. Wir können die obige Lösung so optimieren, dass sie in linearer Zeit funktioniert. Anstatt deleteCharAr() zu verwenden, können wir eine leere Zeichenfolge erstellen und ihr nur erforderliche Zeichen hinzufügen.
StringBuilder wird verwendet, um die Eingabezeichenfolge zu bearbeiten. Dies liegt daran, dass StringBuilder veränderbar ist, während String ein unveränderliches Objekt ist. Das Erstellen einer neuen Zeichenfolge benötigt O(n) Speicherplatz, sodass zusätzlicher Speicherplatz O(n) beträgt.
Wir haben zwei weitere Ansätze zur Lösung dieses Problems besprochen.
Überprüfen Sie, ob die Zeichenfolge der durch ein Muster definierten Reihenfolge der Zeichen entspricht oder nicht | Satz 1
Überprüfen Sie, ob die Zeichenfolge der durch ein Muster definierten Reihenfolge der Zeichen entspricht oder nicht | Satz 3