我需要在由用户给出的输入中查找模式。如果找到了,则返回(开始,结束)位置。如何搜索字符串/字符数组中的模式?
例如: -
输入= A B C D B C A D
模式寻找= D C A
输出= 3,6
图案不必连续发生。
它可以像D是在输入的开始,C在中间和A在结束。 - 一个有效的场景。
我对此感到困惑的两件事。
如何接受输入?作为一个数组?如果是,那么作为一个字符串或字符数组?
如何查找图案?
我需要在由用户给出的输入中查找模式。如果找到了,则返回(开始,结束)位置。如何搜索字符串/字符数组中的模式?
例如: -
输入= A B C D B C A D
模式寻找= D C A
输出= 3,6
图案不必连续发生。
它可以像D是在输入的开始,C在中间和A在结束。 - 一个有效的场景。
我对此感到困惑的两件事。
如何接受输入?作为一个数组?如果是,那么作为一个字符串或字符数组?
如何查找图案?
输入格式在这里并不重要:您可以将字符串和序列都作为字符串。诀窍在于决定使用哪种算法来解决问题。
在这种情况下,一个贪婪的策略将工作:
S
(串)和P
(模式)。si
为字符串,pi
为模式,并将它们都设置为零。P.charAt(pi)
在S
从si
开始。如果字母不能从si
到端子串中找到,则该图案中不存在P.charAt(pi)
第一次出现在S
,由一个设置si
该索引加一,和预先pi
。P
的末尾,则完成P
的长度。请注意,此问题可能存在多种解决方案。当存在解决方案时,该算法找到解决问题的第一个“词典”索引集合。
我正在使用嵌套For循环。 还有其他更好的方法吗? – R11G
@ R11G您只需要一个显式循环 - 通过'P'的元素。通过调用'S.indexOf(si,P.charAt(pi))'而不是显式的嵌套循环来寻找下一个匹配。 – dasblinkenlight
解决它使用正则表达式,但我无法解决与你建议的Algo。为什么这是一个“贪婪”的策略?任何特殊的特征? – R11G
你的例子不清楚。 D C未在您的输入中提供 – Udy
3,6如何根据您的输入有效回答? –
这里有一个问题。 该模式可能会出现空隙。不一定是连续的。 – R11G