java - 构造子串的字符串操作

标签 java linked-list

给定一个由 N 个字符组成的字符串 A 和一个由 M 个字符组成的字符串 B,返回必须声明 A 以使 B 是重复字符串的子字符串的次数。如果 B 永远不可能是重复 A 的子串,那么您的函数应该返回 -1。

例如:

A = "abcd"
B = "cdabcdab"

函数应该返回 3,因为在声明字符串 A 三次之后我们得到了字符串“abcdabcdabcd”。字符串 B 是该字符串的子字符串。

尝试:目前卡在此处 - 在我开始编写代码之前先尝试构建和算法 - 真的可以在这里使用推送。我正在尝试考虑最小长度 A 必须在它包含 B 作为子字符串之前。不确定这是否是正确的方法。

最佳答案

思路是先一直自追加A,直到变大或者等于B(姑且称之为A+)。这将处理 B 完全位于 A+ 内的情况。 如果不是,则这是 B 从前面或后面环绕 A+ 的情况。对于正面包装,在 A+ 前加上 A,对于背面包装,在 A+ 后缀上加上 a。在每一次包装后检查 B 现在是否是 A+ 的子串。如果 B 现在不是子串,那么它永远不会是。

这是 Java 中的解决方案。

private static int times(String A, String B) {      

    StringBuffer aPlus = new StringBuffer(A);
    int times = 1;
    while (aPlus.length() < B.length()) {
        aPlus.append(A);
        times++;
    }

    if (aPlus.indexOf(B) != -1) {
        return times;
    }

    // prefix 
    aPlus.append(A);
    if (aPlus.indexOf(B) != -1) {
        return ++times;
    }

    //suffix
    aPlus.insert(0, A);
    if (aPlus.indexOf(B) != -1) {
        return ++times;
    }
    return -1;
}

关于java - 构造子串的字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46761774/

相关文章:

java - 如果我在配置类上使用 @ActiveProfiles 注释而不是在定义我的 bean 的类上使用它,在 Spring 中会发生什么?

java - 如何对 LinkedList<String> 进行排序?

c++ - 链表值 C++ 的问题

java - 为什么Java中Runtime.getRuntime().exec()找不到 "chgport.exe"?

java - 在非交互式脚本中安装 jre

java - 使用 JNI 在 C++ 和 JAVA 之间进行通信时,我将 "this"保存在哪里?

java - 将对象添加到队列后访问对象变量?

c - 为什么这个 C 链表程序给出 'segmentation fault' ?

c - 丢失链表中的根节点?

java - 区分jpa DataIntegration异常