我今天遇到了一个问题,问题是:
假设我想查找以下子字符串的总出现次数:
Any substring that starts with 1 followed by any(0 or more) number of 0's
and then followed by 1.
我用两种方式解决了这个问题:
方法1
我为它形成了一个正则表达式:1[0]*1
并使用Pattern
和Matcher
类来解决问题。
方法2
每当模式匹配时,我遍历字符串并递增计数器。
我的问题是,与我的第二种方法相比,我的第一种方法非常低效。我认为内置函数的使用效率更高。在所有情况下都不会发生这种情况。时间间隔非常大。
以下是证据:
import java.util.regex.*;
class Pat_mat
{
public static void main(String []args)
{
String str="111011010000001011";
Pattern p=Pattern.compile("10*(?=1)");
Matcher matcher=p.matcher(str);
int s=0,i;
long st=System.nanoTime();
while(matcher.find())
++s;
long ft=System.nanoTime()-st;
System.out.println("time taken by inbuilt fn "+ft);
System.out.println("output: "+s);
s=0;i=0;
st=System.nanoTime();
while(i<str.length())
{
if(str.charAt(i)!='1')
{++i;continue;}
else
{
if(i+1<str.length()&&str.charAt(i+1)=='1')
++s;
else if(i+1<str.length()&&str.charAt(i+1)=='0')
{while(i+1<str.length()&&str.charAt(i+1)=='0')
++i;
if((i+1)<str.length()&&str.charAt(i+1)=='1')
++s;}
}
++i;
}
ft=System.nanoTime()-st;
System.out.println("time taken by my way "+ft);
System.out.println("output: "+s);
}
}