【问题标题】:Check if string contains the substring's sequence of characters in order, but not necessarily right next to each other检查字符串是否按顺序包含子字符串的字符序列,但不一定彼此相邻
【发布时间】:2015-08-26 14:12:34
【问题描述】:

给定两个字符串,如果第一个字符串按顺序包含第二个字符串的字符序列,则返回 true,但不一定彼此相邻。

例如,字符串:“我饿了,现在想要食物”,子字符串:“mto”。句子中 o 在 t 之前的子串不算数,它们必须按顺序排列,但不一定要紧挨着。

我不是真的在寻找代码,只是一般来说你会如何解决这个问题!

【问题讨论】:

  • 你的意思是subsequence
  • 检查第一个字符串中第二个字符串的每个字符的索引,并编写比较逻辑。
  • 我会遍历第一个字符串,注意其中的字符何时匹配第二个中的第一个尚未匹配的字符。几乎和我用铅笔和纸做的一样。

标签: java c++ string algorithm


【解决方案1】:

一个简单的实现就像

从一侧到另一侧遍历两个字符串。如果找到匹配的字符,请在两个字符串中前进。否则只能在 s2 中前进。

bool isSubSequence(std::string s1, std::string s2) {
    int j = 0;
    for (int i = 0; i < s2.length() && j < s1.length(); ++i)
        if (s1[j] == s2[i])
            ++j;
    return j == s1.length();
}

【讨论】:

    【解决方案2】:

    也许只使用 O(N) 贪心算法?

    正如您所说,您不需要代码,我将步骤描述如下: 设S 为字符串,P 为模式

    1. 维护一个指向P的指针PT,最初指向P的前面
    2. 对于S 中的每个字符,检查S[i] 是否等于P 中由PT 指向的字符
    3. 如果是,将PT 移动到P 的下一个字符,如果它是您找到的最后一个字符

    【讨论】:

      【解决方案3】:

      我会建议使用正则表达式来解决这个问题。 将您的子字符串转换为有效的 java 正则表达式。 示例mto 可以转换成类似.*\m.*\t.*\o.* 的东西 然后你可以使用java PatternMatcher

      (注意:正则表达式中的.* 表示任何字符零次或多次。字符前面的\ 表示正则表达式解析器考虑字符的文字值)

      【讨论】:

        【解决方案4】:

        通常,当您第一次遇到问题时,您应该先评估自己将如何解决问题,然后再考虑如何对计算机进行编程。

        如果您尝试自己解决示例问题,您很可能会从第二个字符串中的第一个字符“m”开始,然后搜索该字符在字符串中的第一次出现。在第 3 个索引位置找到“m”后,您将从第 4 个索引开始计算以找到子字符串中的下一个字母。您将继续评估,直到发生以下两种情况之一:

        1. 您找不到其中一个字母。这意味着结果是false
        2. 子字符串中的字母用完了。这意味着结果是true

        如果您了解如何自己解决问题,只需将解决方案分解为多个步骤即可。

        你没有要求它,但如果它让它更清楚,这里有一个解决问题的简单方法:

        public static boolean sub(String string, String substring) {
            // Keep track of our position in the string.
            int index = 0;
        
            // Iterate through all of the characters in the substring.
            for (char character : substring.toCharArray()) {
                // Find the current character starting from the last character we stopped on.
                index = string.indexOf(character, index);
                // If the method returned -1, the character was not found, so the result is false.
                if (index == -1)
                    return false;
            }
        
            // If we reach this point, that means all characters were found, so the result is true.
            return true;
        }
        

        【讨论】:

          【解决方案5】:

          您必须一次搜索一个子字符串字符。既然你说你不需要代码,我会试着用文字解释一下(用一些 Java API 调用供参考)。

          对于子字符串中的每个字符,找到该字符在字符串中的第一次出现(在本例中,'m',然后是't',然后是'o')。您可以致电String.indexOf(String char) 来完成此操作。跟踪找到该字符的索引,当您在字符串中搜索下一个字符(在本例中为“t”)时,使用String.substring(idx, -1).indexOf(String char) 从该索引开始查找字符串的子集。 -1 将从先前找到的字符 ('m') 的索引开始搜索,直到字符串的末尾。

          不断迭代 Substring 的字符,会发生两种情况之一。第一个是你不会在String的子集中找到字符,这意味着Substring没有按顺序在那里。第二种可能是你会走到 Substring 的末尾,所有的字符都已经按顺序找到了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-24
            • 1970-01-01
            • 2017-03-06
            • 1970-01-01
            • 2011-11-09
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多