简体   繁体   English

如何在Java中查找二进制字符串的子字符串

[英]How to find sub string of a binary string in java

String s="101010101010";
String sub=""; //substring
int k=2;


   package coreJava;
    import java.util.Scanner; 
    public class substring {    
           public static void main(String args[])
           {
              String string, sub;
              int k, c, i;

              Scanner in = new Scanner(System.in);
              System.out.println("Enter a string to print it's all substrings");
              string  = in.nextLine();

              i = string.length();   

              System.out.println("Substrings of \""+string+"\" are :-");

              for( c = 0 ; c < i ; c++ )
              {
                 for( k = 1 ; k <= i - c ; k++ )
                 {
                    sub = string.substring(c, c+k);
                    System.out.println(sub);
                 }
              }
           }
        }
  1. take a binary string s="1010011010"; 取二进制字符串s =“ 1010011010”; //etc //等等
  2. take one variable k=2; 取一个变量k = 2;
  3. take another variable i; 取另一个变量i; //which is the length of the sub string(i>k) //这是子字符串的长度(i> k)

now i want to find sub string of the above string, in such a way that if k=2,the number of 1's in sub string must be 2,if k=3,the number of 1's in substring must be 3 and so on... 现在我想找到上述字符串的子字符串,以这种方式,如果k = 2,子字符串中1的数目必须为2,如果k = 3,子字符串中1的数目必须为3,依此类推...

Output should be like this: 
string s="1010011010" 
Enter value of k=2; 
Enter length of substring i=3; 
substring= 101 110 101 011

Iterate over the characters and count the number of one's. 遍历字符并计数一个字符的数量。 If the counter reaches the desired number, stop iterating and take the substring from index zero to where you got. 如果计数器达到所需的数目,请停止迭代,并将子串从索引零移到您得到的位置。

String str = "010101001010";
int count = 0;
int k = 2;
int i = 0;
for (; i < str.length() && count < k; ++i)
{
    if (str.charAt(i) == '1') count++;
}

Create a "window" the length of your desired substrings which you move along the string, maintaining a count of the number of 1s in your current window. 创建一个“窗口”,该窗口沿字符串移动所需的子字符串的长度,并在当前窗口中保持1的计数。 Each iteration you move the window along one, testing the next character outside the current window, the first character in the current window and updating the count accordingly. 每次迭代都将窗口沿一个方向移动,测试当前窗口外的下一个字符,当前窗口中的第一个字符,并相应地更新计数。 During each iteration, if your count is equal to the desired length, print the substring from the current window. 在每次迭代期间,如果您的计数等于所需的长度,请从当前窗口中打印子字符串。

public class Substring {

    public static void main(String[] args) {
        String str = "1010011010";

        int k = 2;
        int i = 3;

        printAllSubstrings(str, i, k);

    }

    private static void printAllSubstrings(String str, int substringLength, int numberOfOnes) {
        // start index of the current window
        int startIndex = 0;

        // count of 1s in current window
        int count = 0;

        // count 1s in the first i characters
        for (int a = 0; a < substringLength; a++) {
            if (str.charAt(a) == '1') {
                count++;
            }
        }

        while (startIndex < str.length() - substringLength + 1) {
            if (count == numberOfOnes) {
                System.out.print(str.substring(startIndex, startIndex + substringLength));
                System.out.print(" ");
            }
            // Test next bit, which will be inside the window next iteration
            if (str.length() > startIndex + substringLength && str.charAt(startIndex + substringLength) == '1') {
                count ++;
            }
            // Test the starting bit, which will be outside the window next iteration
            if (str.charAt(startIndex) == '1') {
                count --;
            }
            startIndex++;
        }   
    }
}

This outputs: 输出:

101 011 110 101 

You could use regular expressions: 您可以使用正则表达式:

public class BinaryString {

    public static void main(String[] args) {
        String binary = "11000001101110";

        int count = 3;
        String regEx = "1{" + count + "}";

        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(binary);

        if (m.find()) {
            int startIndex = m.start();
            System.out.println("MATCH (@index " + startIndex + "): "+ m.group());
        } else {
            System.out.println("NO MATCH!");
        }
    }
}

OUTPUT OUTPUT

MATCH (@index 10): 111

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM