用于构造子字符串的String Manipulation

时间:2017-10-16 01:28:16

标签: java linked-list

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

EX:

A = "abcd"
B = "cdabcdab"

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

尝试:目前停留在这里 - 在我开始编写代码之前尝试构造和算法 - 可以真正使用推送。我想要考虑到包含B作为子串之前A必须达到的最小长度。不确定这是否是正确的方法。

4 个答案:

答案 0 :(得分:3)

首先要保持自我附加的A直到它变得大于或等于B(让我们称之为A +)。这将处理B完全位于A +内的情况。 如果它不是,那么这是从前面或后面围绕A +缠绕的情况。对于前包装,前缀A +带A,后备包装后缀A +带a。如果B现在是A +的子字符串,请在每次这些包装后检查。如果B即使是现在也不是子串,那么它将永远不会。

这是Java的解决方案。

$('.button1').on('click', function() {
  animateDiv();
})

$(document).keyup(function(e) {
  if (e.keyCode === 27 && $('.inner').hasClass('visible')) {
    animateDiv();
  }
})

function animateDiv() {
  $('.inner').toggleClass('visible');
  $('.inner').animate({
    width: 'toggle',
  }, 350);
}

答案 1 :(得分:0)

您的说明中包含大部分算法:

  

...在说明字符串A三次后,我们获得字符串" abcdabcdabcd"。字符串B是此字符串的子字符串。

所以你需要创建一个临时变量来保持"乘以" string,然后检查字符串B是否在临时变量中。您还需要一个变量来保存乘以A的次数。总之,虽然字符串B不包含在字符串A中,但请保持乘以字符串A.

以下是一个例子:

public class MyClass {
    public static void main(String args[]) {
        System.out.println(substrInMultiple("abcd", "cdabcdab"));
    }

    public static int substrInMultiple(String A, String B) {
        String multiple = A;
        int multipleCount = 1;
        while(!multiple.contains(B)) {
            multiple += A;
            multipleCount++;
        }
        return multipleCount;
    }
}
但是,请注意。它有可能有一个永远不会成为另一个子串的字符串,无论它乘以多少次。这将创造一个无限循环。

答案 2 :(得分:0)

public int solution(String A, String B) {
    int count = 0;
    while(A.length() < B.length()) {
        A += A;
        count++;
    }
    for(int i = 0; i < A.length() - B.length(); ++i) {
        if(A.substring(i, i + B.length()).equalsIgnoreCase(B)) {
            return count;
        }
    }
    return -1;
}

答案 3 :(得分:0)

如果可能的话,最大重复次数将等于 1 + B.length / A.length

还要预先验证是否可以重复。

  int formSubString(String A, String B) {
            Set<Character> set1 = new HashSet<>();
            for (char x: A.toCharArray()){
                set1.add(x);
            }

            Set<Character> set2 = new HashSet<>();
            for (char x: B.toCharArray()){
                set2.add(x);
            }

            if (!set1.containsAll(set2)){
                return -1;
            }
            int counter = 1;

            // maxCounter would be more than 1 of B.length/A.length if possible
            int maxCounter = B.length()/A.length()+1;
            String newA  = A;
            while(counter<= maxCounter){
                newA = newA+A;
                counter++;
                if (newA.contains(B)){
                    return counter;
                }
            }
            return -1;
        }