求助解析Java实现字符串子串替换的代码运行逻辑
字符串子串替换Java代码解析
需求说明
给定三个字符串S、S1、S2(分别包含N、M、K个字符),需要将S中所有匹配S1的子串替换为S2。例如输入S="abababa",S1="aba",S2="a",输出结果为"aba"。
实现代码
import java.util.Scanner; public class stringint { public static void substring(String s, String s1,String s2) { String ans = ""; for (int i = 0; i < s.length(); i++) { int k = 0; if (s.charAt(i) == s1.charAt(k) && i+s1.length() <= s.length()) { int j; for (j = i; j < i+s1.length(); j++) { if (s.charAt(j) != s1.charAt(k)) { break; } else { k = k + 1; } } if (j == i + s1.length()) { ans += (s2); i = j - 1; } else { ans += (s.charAt(i)); } } else { ans += (s.charAt(i)); } } System.out.println(ans); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter the string s:"); String s = sc.next(); System.out.println("Enter the string s1:"); String s1 = sc.next(); System.out.println("Enter the string s2:"); String s2 = sc.next(); substring(s, s1, s2); } }
代码运行机制解析
核心逻辑:逐字符遍历+局部匹配验证
- 初始化结果容器:
String ans = ""用来存储最终替换后的字符串。 - 外层遍历主字符串S:用
i作为S的索引,逐个遍历每个字符。 - 触发匹配检查的条件:
每次遍历先初始化k=0(k是S1的索引),如果当前S的字符s.charAt(i)等于S1的第一个字符s1.charAt(k),并且当前位置i加上S1的长度不会超出S的范围(避免数组越界),就开始验证是否完整匹配S1。 - 内层循环验证完整匹配:
用j从i开始遍历,逐个对比s.charAt(j)和s1.charAt(k):- 一旦发现字符不相等,立刻跳出循环,说明匹配失败。
- 字符相等的话,
k自增,继续对比下一个字符。
- 匹配结果处理:
- 如果内层循环结束时
j == i + s1.length(),说明从i开始的子串完全匹配S1:把S2追加到ans里,同时把i设为j-1(因为外层循环i会自动自增,这样就能跳过已经匹配的S1字符,避免重复处理)。 - 如果匹配失败,直接把当前S的字符
s.charAt(i)追加到ans里。
- 如果内层循环结束时
- 不触发匹配的情况:如果当前字符和S1第一个字符不相等,或者剩余长度不够容纳S1,直接把当前字符追加到
ans。
示例走一遍(S="abababa",S1="aba",S2="a")
i=0:s[0]是a,和s1[0]匹配,且0+3<=7。内层循环j从0到2,逐个匹配a、b、a,全部吻合。j最终等于3,所以ans加"a",i设为2。外层循环i自增到3。i=3:s[3]是b,和s1[0]不匹配,直接把b加到ans,ans变为"ab"。i自增到4。i=4:s[4]是a,和s1[0]匹配,4+3=7<=7。内层循环j从4到6,匹配a、b、a,全部吻合。j等于7,ans加"a",i设为6。外层循环i自增到7,超出s.length()=7,循环结束。- 最终ans是"aba",和示例输出一致。
内容的提问来源于stack exchange,提问作者Akram
相关产品推荐
相关产品推荐

