> 文档中心 > 2022/4/8算法的第五章字符串的讲解。主题《String》

2022/4/8算法的第五章字符串的讲解。主题《String》


1 返回字符串的长度 

 

 


2 返回字符串的指定的位置,注意:字符串的第一个下标为0。

 


3字符串的拼接


运行结果。

 


4测试此字符串是否以指定的后缀结尾。

 

5返回指定子字符串第一次出现的字符串内的索引。

 6 返回指定子字符串最后一次出现的字符串内的索引

 7用新的字符将字符串的某些旧字符替换掉。

 8将字符串中的所有大写字母转换为对应小写字母,将字符串中的所有小写字母转换为对应大写字母。

 9去除字符串中首尾的空格

上面九种方案运行结果。

 


10利用reverse(名称)进行字符串的翻转。

 运行结果:

11创建一个36开白可变的字符串对象,不包含任何内容,将一个字符串转换为可变内容的字符串 

 

 


12 StringBuilder append(String str)将指定的字符串附加到此字符序列,StringBuilder reverse()字符串的反转

 

 13题型一。判断字符串有无重复字符.

 

 

package Demo16;import java.util.Scanner;/** * 第五章 * 5.1 题解:判断字符串有无重复字符 * @author MZFAITHDREAM * */public class 字符串专题一 {static boolean checkDifferent(String iniString){ if (iniString.isEmpty()) {     return true; } int []flag = new int[128]; // 扫描字符串 for (int i = 0; i 0) {  return false;     }else {  flag[c]++;     } } return true;    } public static void main(String[] args) {    Scanner sc=new Scanner(System.in);System.out.println("请用户输入你的字符串的内容");String  a=sc.next(); System.out.println("如果有重复返回FALSE"); System.out.println(checkDifferent(a));    }}

 14 题型二 巧妙翻转字符串。sBuffer.reverse().toString();

package Demo16;import java.util.Iterator;import java.util.Scanner;/** * 字符串的 * 5.2 题解:巧妙翻转字符串 * @author MZFAITHDREAM * */public class 字符串专题二 {public static String reverseString_1 (String iniString){//      StringBuilder sBuilder = new StringBuilder(iniString)  // 和StringBuffer效果差不多。StringBuffer sBuffer = new StringBuffer(iniString);      return sBuffer.reverse().toString();  }public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请用户输入你的字符串的内容");String  a=sc.next(); System.out.println("如果有重复返回FALSE"); System.out.println(reverseString_1(a));}}

 15题型三

 

 

 16 题型四 :替换字符串中的空格。 题型四

package Demo16;import java.util.Scanner;/** * 字符串三 * @author MZFAITHDREAM * 5.4 实践:替换字符串中的空格 * */public class 字符串专题四 {   public static void main(String[] args) { System.out.println("解法一:"+replaceSpace("Mr John Smith", 13)); System.out.println("解法二:"+replaceSpace("Mr John Smith 00 000 00 0000 000000 0000".toCharArray(), 13));    }public static String replaceSpace(String iniString, int length) { return iniString.replaceAll("\\s", "%20");    }  static String replaceSpace(char[] iniString,int length){ int count = length; for (int i = 0; i =0){     if (iniString[p1]==' ') {  iniString[p2--] = '0';  iniString[p2--] = '2';  iniString[p2--] = '%';     }else {  iniString[p2--] = iniString[p1];     }     p1--; } return new String(iniString, 0, count);    }}

 17压缩字符串。题型五

package Demo16;/** * 5.5 题解:压缩字符串 * @author MZFAITHDREAM * */public class 字符串的专题五 {public static void main(String[] args) {String  res =zipString("aaabccb");System.out.println(res);}static String zipString(String src){    int count = 0; // 记录前一个字符的重复次数    char last = 0; // 上一个字符    StringBuilder sb = new StringBuilder();    for (int i = 0; i =1) { sb.append(count);    }    // 比较新字符串和原字符串    if (sb.length()>= src.length()) { System.out.println("字符串没有变短:"+sb.toString()); return "原字符串:"+src;    }    return sb.toString();}}

 18判断两字符串的字符集是否相同

package Demo16;/** * 5.6 题解:判断两字符串的字符集是否相同 * @author MZFAITHDREAM * */public class 字符串专题六 { public static void main(String[] args) { System.out.println(check_1("abc", "ab")); System.out.println(check_1("abc", "abc"));    } /**     * 限制字符串组成的字符为ASCII     * 解法一     */    static boolean check_1(String s1,String s2){ int[] help1 = new int[128]; //扫描s1 for (int i = 0; i < s1.length(); i++) {   char c = s1.charAt(i);   if (help1[c] == 0)     help1[c] = 1; }  int[] help2 = new int[128]; //扫描s2 for (int i = 0; i < s2.length(); i++) {   char c = s2.charAt(i);   if (help2[c] == 0)help2[c] = 1; } for (int i = 0; i < help2.length; i++) {     if (help1[i]!=help2[i]) {  return false;     } } return true;    }}

19旋转词

 20 单词的翻转

 21神奇的回文串

package Demo16;/** * 5.10 题解:神奇的回文串 * 1000到999回文数 * @param args */public class 字符串专题十 {public boolean isPalindrame(String src) {if(src.isEmpty()) {return true;}return src.equals(new StringBuilder(src).reverse().toString());}static void polindromeNumber() {for (int i = 1; i <10; i++) {for (int j = 0; j < 10; j++) {/** *  */System.out.println(i*1000+j*100+j*10+i);}}}public static void main(String[] args) {// TODO Auto-generated method stubpolindromeNumber();}}

22最短摘要的生成

package Demo16;import java.util.Arrays;import java.util.HashMap;import java.util.Map;/** * 5.11 题解:最短摘要的生成 * @author MZFAITHDREAM * */public class 字符串专题十一 { public static void main(String[] args) {  solve1(new String[]{"a", "b", "c", "seed", "h", "e", "f", "c", "c", "seed", "e", "f", "seed", "c"},    new String[]{"c", "e"});  solve2(new String[]{"a", "b", "c", "seed", "c", "e", "f", "c", "c", "seed", "e", "f", "seed", "c"},    new String[]{"c", "c", "e", "f"});  solve2(new String[]{"a", "b", "a", "a", "b", "c", "d", "h", "e", "f", "f"}, new String[]{"b", "c", "d"});    } /** * 所搜关键字 * @param w * @param q */    public static void solve1(String[] w, String[] q) { int length = Integer.MAX_VALUE; int begin = -1; int end = -1; for (int i = 0; i < w.length; i++) {     // 求以i开头包含所有关键字的序列     for (int j = i+1; j < w.length; j++) {  // 如果全部关键字已经再seq中。  if (containsAll(q,w,i,j)) {      // 判断当前这个序列是不是较短的序列      // System.out.println(seq);      if (j-i+1<length) {   length = j-i+1;   begin = i;   end = j;      }      break;  }     } } print(w,begin,end);    } /**     * 这种解法解决了keys关键字中有重复的现象     * @param w     * @param keys     */    public static void solve2(String[] w, String[] keys) { Arrays.sort(keys); // begin和end用于在找到更短的包含全部关键字的子数组时更新 int begin = -1; int end = -1;  int j = -1;  // 上一次囊括了所有关键字的右边界  int minLen = Integer.MAX_VALUE; for (int i = 0; i < w.length; i++) {     // 如果i位置是关键字,求以i开头包含所有关键字的序列     String word1 = w[i];     int index = Arrays.binarySearch(keys, word1);     if (-1==index) {  continue;     }else {  // i是一个关键字  // 如果已经全部找到  if (j=i&&containsAll(keys, w, i, j)) {      if (j-i+1<minLen) {  // 更新   minLen = j-i+1;   begin = i;   end = j;      }      continue;  }     }   if (j==-1) {  j = j+1;   // j值初始化     }     while(j<w.length){  String word2 = w[j];  // 文章单词  int index1 = Arrays.binarySearch(keys, word2);  if (-1==index1) {      j++;      continue;  }else {  // 找到关键字  这里应该是第一次扫描的包含所有关键字的  然后继续for循环不断更新边界      if (containsAll(keys, w, i, j)) { //全部到齐     if (j - i + 1 < minLen) {// 更新minLen = j - i + 1;begin = i;end = j;   }   break;      }else {   j++;      }  }     } } print(w, begin, end);    }     private static boolean containsAll(String[] keywords, String[] w, int i, int j) { Map map = new HashMap(); for (int k = 0; k < keywords.length; k++) {     String key = keywords[k];     if (map.get(key)==null) {  map.put(key, 1);     }else {  map.put(key, map.get(key)+1);     } }  Map map2 = new HashMap(); for (int k = i; k <= j; k++) {     String key = w[k];     if (map2.get(key)==null) {  map2.put(key, 1);     }else {  map2.put(key, map2.get(key)+1);     } } for(Map.Entry e:map.entrySet()){     if (map2.get(e.getKey())==null||map2.get(e.getKey())<e.getValue()) {  return false;     } } return true;    }     private static void print(String[] w, int begin, int end) { System.out.println(begin+" "+end); for (int i = begin; i <=end; i++) {     System.out.print(w[i]+" "); } System.out.println();    } }

23 字符串匹配之RabinKarp(上)


package Demo17;/** *  * @author MZFAITHDREAM *5.12 字符串匹配之RabinKarp(上) */public class 字符串专题十二 {public static void main(String[] args) {String s="ABABABA";String P="ABCDEF"; new 字符串专题十二().match(P, s);}private static void match(String p,String s) {long hash_p=hash(p);int p_len=p.length();for (int i = 0; i+p_len <= s.length(); i++) {long hash_i=hash(s.substring(i,i+p_len));if(hash_i==hash_p) {System.out.println("match"+i);}}}private static long hash(String p) {// TODO Auto-generated method stubreturn 0;}}

24字符串匹配之后缀数组(上)

package Demo17;/** * @author MZFAITHDREAM * Next数组 * 5.16 字符串匹配之后缀数组(上) * */public class 字符串专题是13 {public static void main(String[] args) {// TODO Auto-generated method stubString src="babababcbabababb";int index=indexOf(src,"bababbcdf");//index =indexOf(src,"bababb");System.out.println(index);}private static int indexOf(String s, String p) {// TODO Auto-generated method stubif(s.length()==0||p.length()==0) return -1;if(p.length()>s.length()) return -1;int [] next=next(p);int i=0;int j=0;int slen=s.length();int plen=p.length();while(i<slen) {if(j==-1||s.charAt(i) ==p.charAt(j)) {i++;j++;}else {j=next[j];}if(j==plen) {return(i-j);}}return -1;}private  static int[] next(String ps) {int plength =ps.length();int [] next=new int[plength];char[] p=ps.toCharArray(); next[0]=-1;if(ps.length()==1)return next;next[1]=0;int j=1;int k=next[j];while(j<plength-1) {if(k<0 ||p[j]==p[k]) {next[++j] =++k;} else {k=next[k];}}return next;}}

25字符串匹配之KMP(上)

package Demo17;import java.util.List;public class 字符串专题十四 {/** * 5.14 字符串匹配之KMP(上) * @param args * KMPS 思路 *//** * 暴力解发 * @param args */public static void main(String[] args) {String src="babababcbabababb";int index=indexOf(src,"bababb");System.out.println("暴力破解法解决问题:======");System.out.println(index);System.out.println("------------------------");}/** * @i="原数组的指针 * 暴力破解法 * @param src * @param key * @return */private static int indexOf(String s,String p) {int i=0;int sc=i;int j=0;while(sc<s.length()) {if(s.charAt(sc)==p.charAt(j)) {sc++;j++;if(j==p.length())return i;} else {i++;sc=i; //以i为起点 j=0; //j为0}}return -1;}}

26字符串匹配之KMP(下)


package Demo17;/** * 5.15 字符串匹配之KMP(下) * @author MZFAITHDREAM * */public class 字符串专题十五 {public static void main(String[] args) {// TODO Auto-generated method stubString src="babababcbabababb";int index=indexOf(src,"baba");//index =indexOf(src,"bababb");System.out.println(index);}private static int indexOf(String s, String p) {// TODO Auto-generated method stubif(s.length()==0||p.length()==0) return -1;if(p.length()>s.length()) return -1;int count=0;int [] next=next(p);int i=0;int j=0;int slen=s.length();int plen=p.length();while(i<slen) {if(j==-1||s.charAt(i) ==p.charAt(j)) {i++;j++;}else {j=next[j];}if(j==plen) {count++;i--;j=next[j-1];//return(i-j);}}return count;}private  static int[] next(String ps) {int plength =ps.length();int [] next=new int[plength];char[] p=ps.toCharArray(); next[0]=-1;if(ps.length()==1)return next;next[1]=0;int j=1;int k=next[j];while(j<plength-1) {if(k<0 ||p[j]==p[k]) {next[++j] =++k;} else {k=next[k];}}return next;}}

27 字符串应用:尺取法例题。

package Demo17;import java.util.Scanner;public class 字符串专题19 {/** * 5.19 字符串应用:尺取法例题 * @param args * 尺取法 */public static void main(String[] args) {//1.输入字符串Scanner sc = new Scanner(System.in);char[] w = sc.next().toCharArray();//2.遍历字符串int min = Integer.MAX_VALUE;//存放当前仅包含2个h、1个i、1个o的最短子串长度int j=-1;//子数组的尾坐标for(int i=0;i<w.length;i++) {char w1 = w[i];if(check(w1)) {//该字符合法,找到当前子数组的第一个位置i,接着j向后查找if(j==-1) {//j的第一次定位j=i+1;}//从j开始循环,找到合适的子数组while(j<w.length) {char w2 = w[j];if(check(w2) && containAll(w, i, j)) {//如果当前字符合法,并且包含所有字符(出现次数一致),则判断当前子数组是否小于当前最小子数组长度if(checkAll(w, i, j) && j-i+1 < min) {min = j-i+1;}break;//完成一次查找,接着查找下一个合法子数组(注意,只要包含2个h、1个i、1个o,就退出,出现次数超了也要退出)}j++;}//while}//if}//for//3.输出最小的子数组长度System.out.println(min==Integer.MAX_VALUE?-1:min);}//1.判断字符c是不是合法,即是不是h、i或oprivate static boolean check(char c) {return c=='h' || c=='i' || c=='o';}//2.判断数组w从下标i到下标j中 是否包含2个h,1个i 和 一个o,不能多也不能少private static boolean checkAll(char[] w,int i,int j) {int c1=0,c2=0,c3=0;for(int k=i;k<=j;k++) {if(w[k]=='h') c1++;if(w[k]=='i') c2++;if(w[k]=='o') c3++;}return c1==2 && c2==1 && c3==1;}//3.判断数组w从下标i到下标j中 是否包含2个h,1个i 和 一个o,可以超private static boolean containAll(char[] w,int i,int j) {int c1=0,c2=0,c3=0;for(int k=i;k=2 && c2>=1 && c3>=1;}}

这才是一部分String用法的展示。还有一些要读者自己去学习。