比较两个唯一字符串时,如何检测模式匹配?

时间:2018-01-13 02:13:05

标签: string algorithm pattern-matching automaton rabin-karp

我正在寻找以下字符串模式匹配问题的解决方案。

你有一个带有两个参数的函数:pattern和input - 都是字符串。

我们说pattern: ddaaddinput: catcatdogdogcatcat

这些特定参数将被视为匹配,因为input的字符中存在模式,并且该模式与pattern中的单词模式匹配

返回boolean以指示哪里有匹配项。 上面给出的示例将返回1

function (pattern, input) {
  // patterns within the input string are elucidated from input
  // those patterns are checked against the pattern
  return boolean
}

3 个答案:

答案 0 :(得分:1)

广义问题"找到给定字符串的模式"要解决起来要困难得多,因为字符串可以符合多种模式。例如,

catcatdogcat

符合许多模式。这是一份非详尽的清单:

aaba           cat cat dog cat
a              catcatdogcat
ab             catcat dogcat
abcabcefgabc   c a t c a t d o g c a t
ababcab        ca t ca t dog ca t

所以我不认为"找到所有模式的方法,然后看看建议的模式是否在其中#34;会工作的。

这意味着我们可能希望使用建议的模式作为指导来尝试打破字符串,但我还不完全确定它看起来如何。

在特定情况下,当模式以相同的子字符串开始和结束时(例如在aaba中),我想你可以从字符串的开头和结尾开始,一次消耗一个字符,直到你得到一个匹配:

catcatdogcat
CatcatdogcaT
CAtcatdogcAT
CATcatdogCAT <-- Substring "CAT" is a candidate for "a". Check if that pattern matches.

但更普遍的情况再次变得更难。但是,可以采用类似的方法,例如尝试每个字符串以查看它是否符合模式,并进行回溯:

catcatdogcat
Catcatdogcat <-- The string isn't "CCsomethingC", so a != "C"
CAtcatdogcat <-- the string isn't "CACAsomethingCA", so a != "CA"
CATcatdogcat <-- the string is "CATCATsomethingCAT", so a = "CAT" is a candidate.

找到候选人后,您可以将其从字符串和模式字符串中删除,从而减少了将dog与模式b进行比较的下一步。在伪代码中,

checkpattern(pattern, string) :=
  if (pattern has just one letter) 
    return true
  if (pattern has more than one letter, but it's one character repeated)
    return whether the string repeats that way
  for (each substring from the start of the string of length x=[0..])
    does the string match this candidate substring following the pattern?
    if (yes)
      if (checkpattern(pattern - letter, string - substring))
        return true
      else
        continue
    if (no)
      continue
  return false

我认为这样可行。很明显,这个伪代码有很多细节,而且效率不高,但它可以完成工作。

答案 1 :(得分:0)

创建一个嵌套循环来检查。

int i =0;
char tester [] = "xyzfffasdfsadf";
bool checker = false;
while (tester[i] != '\0')
{
    if (tester [i] == 'x')
    {
        i++;
       if (tester[i] == 'y')
       {
          i++;
          if (tester[i] == 'z')
          {
             checker = true;
          }
       }
   }else {
    i++;
   }
}
if(checker == true){
cout << "Pattern exist";
}

这是c ++或java中的一种简单方法,我会感觉如此。嵌套循环的数量将是模式存在时要检查的字符数。您还可以在最后一个循环中包含第二个计数器,以递增计数模式发生的次数。

答案 2 :(得分:0)

我是怎么做到的

def check_pattern(s1,s2):
    i=j=97
    p1=p2=""

    for index1,l1 in enumerate(s1):
        if l1 not in s1[0:index1]:
            p1+=chr(i)
            i+=1
        else:
            p1+= chr(97+s1.index(l1))

    
    for index2,l2 in enumerate(s2):
        if l2 not in s2[0:index2]:
            p2+=chr(j)
            j+=1
        else:
            p2+= chr(97+s2.index(l2))

    if p1==p2:
        return True
    else:
        return False

z=check_pattern("aab","xxz")
print(z)