package mianshi;
//将字符串中某个字符串更改为另外一个字符串
// "abcdef"将"bc"->"de"
public class strChange {
//方法1、自带函数解决
public String replace2(String s,String s1,String s2){
if(s.contains(s1)){
s=s.replaceAll(s1,s2);
}
return s;
}
//方法2、指针遍历(代码简单)
public String replace(String s,String s1,String s2){
StringBuilder sb=new StringBuilder();
for (int i = 0; i <s.length() ; i++)
{
boolean finded=false;
for (int j = 0; j <s1.length() ; j++)
{
//如果不相等,直接跳出for循环,将字符加入到sb
if(s.charAt(i+j)!=s1.charAt(j)){
//i+j表示此时的i跟着j一起走了j步,这样不影响外层循环的i
break;
}
//否则相等,并且到达s1的末尾
else if(s.charAt(i+j)==s1.charAt(j)&&j==s1.length()-1)
{
i+=j;
finded=true;
sb.append(s2);//将替换s2 直接append到sb
}
}
if(!finded){
sb.append(s.charAt(i));
}
}
return sb.toString();
}
public static void main(String[] args) {
strChange sc=new strChange();
String str=sc.replace("abcdef","bc","de");
System.out.println(str);
}
}
//方法3、指针遍历,i,j同时移动(复杂)
public String replace(String s,String s1,String s2){
StringBuilder sb=new StringBuilder();
for (int i = 0; i <s.length() ; i++)
{
boolean finded=false;
for (int j = 0; j <s1.length() ; j++)
{
if(s.charAt(i)==s1.charAt(j)){
i++;
if(j==s1.length()-1){
finded=true;
sb.append(s2);
i--;//外循环又有i++
}
}else{
i=i-j;//退回到原来位置
break;
}
}
if(!finded){
sb.append(s.charAt(i));
}
}
return sb.toString();
}
//方法4、定义局部变量temp,指向指针i,从而不影响外层大循环(推荐)
public String replace(String s,String s1,String s2){
StringBuilder sb=new StringBuilder();
for (int i = 0; i <s.length() ; i++)
{
boolean finded=false;
for (int j = 0,temp=i; j <s1.length() ; j++)
{
//设置指针temp记录i指向,从而即使后面不相等,不考虑退回i,从而不影响外循环i
if(s.charAt(temp)==s1.charAt(j)){
temp++;//实现temp++,j++同时移动
if(j==s1.length()-1){
finded=true;
sb.append(s2);
i+=j;//此时i可以向前移动j步了,再经过外层i++,从而比较下一个
}
}else{
break;
}
}
if(!finded){
sb.append(s.charAt(i));
}
}
return sb.toString();
}