Java 在字符串中查找子字符串的匹配项
我试图找到给定字符串中的子字符串数。目前,我的代码没有考虑重叠字符串 比如说 substr=“cde” str=“cdcde” 我的代码:Java 在字符串中查找子字符串的匹配项,java,string,algorithm,Java,String,Algorithm,我试图找到给定字符串中的子字符串数。目前,我的代码没有考虑重叠字符串 比如说 substr=“cde” str=“cdcde” 我的代码: public static int ssCount(String str, String substr) { int count = 0; int strlen = str.length(); int substrlen = substr.length(); int numsubstr = 0; int substrp
public static int ssCount(String str, String substr) {
int count = 0;
int strlen = str.length();
int substrlen = substr.length();
int numsubstr = 0;
int substrpointer = 0;
for (int i = 0; i < strlen; i++) {
if (str.charAt(i) == substr.charAt(substrpointer)) {
substrpointer++;
count++;
}
else {
count = 0;
substrpointer = 0;
}
if (count == substrlen) {
numsubstr++;
count = 0;
}
}
return numsubstr;
}
publicstaticintsscount(stringstr,stringsubstr){
整数计数=0;
int strlen=str.length();
int substrlen=substr.length();
int numsubstr=0;
int substrpointer=0;
对于(int i=0;i
我的尝试:
public static int ssCount(String str, String substr) {
int count = 0;
int strlen = str.length();
int substrlen = substr.length();
int numsubstr = 0;
int substrpointer = 0;
int firstchar = 0;
for (int i = 0; i < strlen; i++) {
if (str.charAt(i) == substr.charAt(substrpointer)) {
substrpointer++;
count++;
if (str.charAt(i) == substr.charAt(0)) {
firstchar = i;
}
}
else {
count = 0;
substrpointer = 0;
i = firstchar;
}
if (count == substrlen) {
numsubstr++;
count = 0;
}
}
return numsubstr;
}
publicstaticintsscount(stringstr,stringsubstr){
整数计数=0;
int strlen=str.length();
int substrlen=substr.length();
int numsubstr=0;
int substrpointer=0;
int firstchar=0;
对于(int i=0;i
我尝试添加第二个指针,指向子字符串第一个字符的下一个匹配项,以便从该点继续比较。但是我遇到了麻烦,因为我可能会遇到一些无限循环。不确定您的问题是什么,可能是如何修复代码,但我的建议是研究解决此问题的标准方法,例如KMP算法。它还有效地考虑了重叠。不确定您的问题是什么,可能是如何修复代码,但我的建议是研究解决此问题的标准方法,例如KMP算法。它还有效地考虑了重叠。不确定您的问题是什么,可能是如何修复代码,但我的建议是研究解决此问题的标准方法,例如KMP算法。它还有效地考虑了重叠。不确定您的问题是什么,可能是如何修复代码,但我的建议是研究解决此问题的标准方法,例如KMP算法。它还有效地考虑了重叠。这将在较大的字符串中查找所有重叠的子字符串。非正则表达式之后是正则表达式。一个有趣的问题
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
<P>{@code java OverlappingSubstringsXmpl}</P>
**/
public class OverlappingSubstringsXmpl {
public static final void main(String[] igno_red) {
String sToFind = "cdc";
String sToSearch = "cdcdcdedcdc";
System.out.println("Non regex way:");
int iMinIdx = 0;
while(iMinIdx <= (sToSearch.length() - sToFind.length())) {
int iIdxFound = sToSearch.indexOf(sToFind, iMinIdx);
if(iIdxFound == -1) {
break;
}
System.out.println(sToFind + " found at index " + iIdxFound);
iMinIdx = iIdxFound + 1;
}
System.out.println("Regex way:");
Matcher m = Pattern.compile(sToFind, Pattern.LITERAL).matcher(sToSearch);
boolean bFound = m.find();
while (bFound) {
System.out.println(sToFind + " found at index " + m.start());
bFound = m.find(m.start() + 1);
}
}
}
这将在较大的字符串中查找所有重叠的子字符串。非正则表达式之后是正则表达式。一个有趣的问题
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
<P>{@code java OverlappingSubstringsXmpl}</P>
**/
public class OverlappingSubstringsXmpl {
public static final void main(String[] igno_red) {
String sToFind = "cdc";
String sToSearch = "cdcdcdedcdc";
System.out.println("Non regex way:");
int iMinIdx = 0;
while(iMinIdx <= (sToSearch.length() - sToFind.length())) {
int iIdxFound = sToSearch.indexOf(sToFind, iMinIdx);
if(iIdxFound == -1) {
break;
}
System.out.println(sToFind + " found at index " + iIdxFound);
iMinIdx = iIdxFound + 1;
}
System.out.println("Regex way:");
Matcher m = Pattern.compile(sToFind, Pattern.LITERAL).matcher(sToSearch);
boolean bFound = m.find();
while (bFound) {
System.out.println(sToFind + " found at index " + m.start());
bFound = m.find(m.start() + 1);
}
}
}
这将在较大的字符串中查找所有重叠的子字符串。非正则表达式之后是正则表达式。一个有趣的问题
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
<P>{@code java OverlappingSubstringsXmpl}</P>
**/
public class OverlappingSubstringsXmpl {
public static final void main(String[] igno_red) {
String sToFind = "cdc";
String sToSearch = "cdcdcdedcdc";
System.out.println("Non regex way:");
int iMinIdx = 0;
while(iMinIdx <= (sToSearch.length() - sToFind.length())) {
int iIdxFound = sToSearch.indexOf(sToFind, iMinIdx);
if(iIdxFound == -1) {
break;
}
System.out.println(sToFind + " found at index " + iIdxFound);
iMinIdx = iIdxFound + 1;
}
System.out.println("Regex way:");
Matcher m = Pattern.compile(sToFind, Pattern.LITERAL).matcher(sToSearch);
boolean bFound = m.find();
while (bFound) {
System.out.println(sToFind + " found at index " + m.start());
bFound = m.find(m.start() + 1);
}
}
}
这将在较大的字符串中查找所有重叠的子字符串。非正则表达式之后是正则表达式。一个有趣的问题
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/**
<P>{@code java OverlappingSubstringsXmpl}</P>
**/
public class OverlappingSubstringsXmpl {
public static final void main(String[] igno_red) {
String sToFind = "cdc";
String sToSearch = "cdcdcdedcdc";
System.out.println("Non regex way:");
int iMinIdx = 0;
while(iMinIdx <= (sToSearch.length() - sToFind.length())) {
int iIdxFound = sToSearch.indexOf(sToFind, iMinIdx);
if(iIdxFound == -1) {
break;
}
System.out.println(sToFind + " found at index " + iIdxFound);
iMinIdx = iIdxFound + 1;
}
System.out.println("Regex way:");
Matcher m = Pattern.compile(sToFind, Pattern.LITERAL).matcher(sToSearch);
boolean bFound = m.find();
while (bFound) {
System.out.println(sToFind + " found at index " + m.start());
bFound = m.find(m.start() + 1);
}
}
}
为什么不使用regex和
Matcher
?您的可能副本似乎还没有任何问题。这不是一个真正的问题,所以投票决定结束。为什么不使用regex和Matcher
?您的可能副本似乎还没有任何问题。这不是一个真正的问题,所以投票决定结束。为什么不使用regex和Matcher
?您的可能副本似乎还没有任何问题。这不是一个真正的问题,所以投票决定结束。为什么不使用regex和Matcher
?您的可能副本似乎还没有任何问题。这不是一个真正的问题,所以投票决定结束。或者Z算法,对实现者来说比较简单Z算法,对实现者来说比较简单Z算法,对实现者来说比较简单Z算法,对实现者来说比较简单通过重叠他指的是类似于pattern=“aba”
和string=“ababa”
(两个重叠匹配)啊。OP说的是“重叠”,但他的例子“cdcde”是不重叠的。我明白了。我认为他根本无法使用任何匹配算法。更新以处理重叠。重叠的意思是类似于pattern=“aba”
和string=“aba”
(两个重叠匹配)啊。OP说的是“重叠”,但他的例子“cdcde”是不重叠的。我明白了。我认为他根本无法让任何匹配算法工作。更新以处理重叠。通过重叠,他指的是像pattern=“aba”
和string=“ababa”
(两个重叠匹配)啊。OP说的是“重叠”,但他的例子是“CDCDCDE”“没有重叠,我明白了。我认为他根本无法使用任何匹配算法。更新以处理重叠。重叠的意思是像pattern=“aba”
和string=“ababa”
(两个重叠匹配)啊。OP说“重叠”,但他的例子“cdcde”并不重叠。我明白了。我想他根本无法找到匹配算法。更新后可以处理重叠。