String 类有一个reverse()方法可以直接反转整个字符串,但并未提供按照自己提供的子串的能进行反转。
我们使用KMP算法,先找到匹配的最后的一个下标再进行反转,再拼接。
代码一:
public static String reverse(String s, String t) { String string = ""; int k = 0; try { byte[] s1 = s.getBytes(); byte[] t1 = t.getBytes(); //KMP算法暴力匹配 int i = 0, j = 0; while (i < s1.length && j < t1.length) { if (s1[i] == t1[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } k = i; int m = k - t1.length; k = k - 1; // 數組交換 while (m < (m + k + 1) / 2) { byte temp = s1[m]; s1[m] = s1[k]; s1[k] = temp; k--; m++; } for (int n = 0; n < s1.length; n++) { string += String.valueOf((char) s1[n]); } } catch (Exception e) { e.printStackTrace(); } return string; }
代码二:
public static String reverse(String s,String t){ String string = ""; int k = 0; try { char [] s1 = s.toCharArray(); char [] t1 = t.toCharArray(); int i = 0,j =0; while(i<s.length() && j<t.length()){ if(s1[i]==t1[j]){ i++; j++; }else{ i = i-j+1; j = 0; } } k = i; int len = t1.length-1; for (int l = k-t1.length; l <k ; l++) { s1[l] = t1[len]; len--; } for (int l = 0; l <s1.length ; l++) { string +=String.valueOf(s1[l]); } }catch (Exception e){ e.printStackTrace(); } return string; }
结果: