字符串 模式匹配

2020-06-22 15:26 更新

題目

你有兩個(gè)字符串,即pattern和value。 pattern字符串由字母"a"和"b"組成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a","go"是"b"),該字符串也匹配像"a"、"ab"和"b"這樣的模式。但需注意"a"和"b"不能同時(shí)表示相同的字符串。編寫(xiě)一個(gè)方法判斷value字符串是否匹配pattern字符串。

  1. 示例 1
  2. 輸入: pattern = "abba", value = "dogcatcatdog"
  3. 輸出: true

  1. 示例 2
  2. 輸入: pattern = "abba", value = "dogcatcatfish"
  3. 輸出: false

  1. 示例 3
  2. 輸入: pattern = "aaaa", value = "dogcatcatdog"
  3. 輸出: false

  1. 示例 4
  2. 輸入: pattern = "abba", value = "dogdogdogdog"
  3. 輸出: true
  4. 解釋: "a"="dogdog",b="",反之也符合規(guī)則

提示:

  1. 0 <= len(pattern) <= 1000
  2. 0 <= len(value) <= 1000
  3. 你可以假設(shè)pattern只包含字母"a""b"value僅包含小寫(xiě)字母。

題解

  1. 我們首先保證 pattern\textit{pattern}pattern 中 aaa 出現(xiàn)的次數(shù)不少于 bbb 出現(xiàn)的次數(shù)。如果不滿足,我們就將 aaa 和 bbb 互相替換;
  2. 如果 value\textit{value}value 為空,那么要求 pattern\textit{pattern}pattern 也為空(?p=0\ell_p = 0?p?=0)或者只出現(xiàn)了字母 aaa(?p?ca=0\ell_p - c_a = 0?p??ca?=0),這兩種情況均等同于 ?p?ca=0\ell_p - c_a = 0?p??ca?=0。在其余情況下,都無(wú)法匹配成功;
  3. 如果 pattern\textit{pattern}pattern 為空且 value\textit{value}value 不為空,那么無(wú)法匹配成功;
  4. 如果 pattern\textit{pattern}pattern 和 value\textit{value}value 均非空,我們就可以枚舉 ?a\ell_a?a? 并使用上面提到的算法進(jìn)行判斷。

  1. class Solution {
  2. public boolean patternMatching(String pattern, String value) {
  3. int count_a = 0, count_b = 0;
  4. for (char ch: pattern.toCharArray()) {
  5. if (ch == 'a') {
  6. ++count_a;
  7. } else {
  8. ++count_b;
  9. }
  10. }
  11. if (count_a < count_b) {
  12. int temp = count_a;
  13. count_a = count_b;
  14. count_b = temp;
  15. char[] array = pattern.toCharArray();
  16. for (int i = 0; i < array.length; i++) {
  17. array[i] = array[i] == 'a' ? 'b' : 'a';
  18. }
  19. pattern = new String(array);
  20. }
  21. if (value.length() == 0) {
  22. return count_b == 0;
  23. }
  24. if (pattern.length() == 0) {
  25. return false;
  26. }
  27. for (int len_a = 0; count_a * len_a <= value.length(); ++len_a) {
  28. int rest = value.length() - count_a * len_a;
  29. if ((count_b == 0 && rest == 0) || (count_b != 0 && rest % count_b == 0)) {
  30. int len_b = (count_b == 0 ? 0 : rest / count_b);
  31. int pos = 0;
  32. boolean correct = true;
  33. String value_a = "", value_b = "";
  34. for (char ch: pattern.toCharArray()) {
  35. if (ch == 'a') {
  36. String sub = value.substring(pos, pos + len_a);
  37. if (value_a.length() == 0) {
  38. value_a = sub;
  39. } else if (!value_a.equals(sub)) {
  40. correct = false;
  41. break;
  42. }
  43. pos += len_a;
  44. } else {
  45. String sub = value.substring(pos, pos + len_b);
  46. if (value_b.length() == 0) {
  47. value_b = sub;
  48. } else if (!value_b.equals(sub)) {
  49. correct = false;
  50. break;
  51. }
  52. pos += len_b;
  53. }
  54. }
  55. if (correct && !value_a.equals(value_b)) {
  56. return true;
  57. }
  58. }
  59. }
  60. return false;
  61. }
  62. }
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)