计理02组08号字符串操作算法

Posted SYF

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计理02组08号字符串操作算法相关的知识,希望对你有一定的参考价值。

字符串问题是我最喜欢玩的

因为字符串问题在我看来任意性很强,好比拼积木,只要符合时间空间复杂度,可以随便玩

当年我参加第十届蓝桥杯Java B组基本也是靠着字符串的优势拿的奖,尽管当时花的心思最多的是DFS,但是最后就考了一道BFS,最后还没做出来给我气的,不过反正结局一样,也懒得去计较了

回文串

问题描述

输入一个字符串(长度在 100 以内),统计其中数字字符出现的次数。

样例输入

Ab100cd200

样例输出

6

分析与解答

这道题其实很简单,核心就是判断数字

查看代码
import java.util.Scanner;

public class CountOfNum 

  public static void main(String[] args) 
    Scanner scanner = new Scanner(System.in);
    String str = scanner.nextLine();
    scanner.close();
    int num = 0;
    for (int i = 0; i < str.length(); i++) 
      // 转换为字符判断是否有数字
      if (str.charAt(i) >= \'0\' && str.charAt(i) <= \'9\') 
        num++;
      
    
    System.out.print(num);
  

统计字符

问题描述

晓晓同学刚刚开始学编程不久,老师打算出一道简单的题目考考她,有一个字符串,有若干个空格,老师想把里面的空格全部替换成为 CODE 这样的字符串,晓晓欣然接受了这个挑战。这么简单的问题可难不住晓晓,她知道 Java 里面有直接实现功能的 api,于是很快就实现了:

查看代码

public String replaceSpace(String str) 
  return str.replaceAll(" ","CODE");

但是这样显示不出她的实力,所以加了一个要求,需要自己去实现数组插入的功能。思路如下:

  • 将字符串转换成为字符数组,遍历一次,统计出空格的个数。
  • 构建出新的字符数组,初始化的大小 = 原来的字符数组长度 + 空格长度 x 3(空格是一个字符,CODE 是 4 个字符,替换一个空格增加了三个字符)。
  • 遍历一次,复制,当不为空格时直接复制,当为空格时,则把 CODE 这几个字符复制过去。

分析与解答

首先忍不住吐槽这位同学,对自己要求高干嘛为难我们呢,不过他提出来了咱们就得做

大家其实学习算法的开始就知道广义的算法就是拿程序解决问题

所以我们要解决两个问题

【1】根据空格数建立新数组

【2】将旧数组的字符放入新数组

这道题其实也不难,就是用数组来做,实际上很多同学会犯的一个错误就是构建新数组的同时再放入字符

其实也不需要,这样等于就我们一段代码干两件事情非常麻烦

一段代码尽可能做一件事情

查看代码

public class ReplaceSpaceSolution 

  public static void main(String[] args) 
    System.out.println(replaceSpace(new StringBuffer("Hello Wolrd !lanqiao")));
  

  public static String replaceSpace(StringBuffer str) 
    // 转换成为字符数组
    char[] originChars = str.toString().toCharArray();
    int spaceNum = 0;
    // 计算出空格的个数
    for (int i = 0; i < originChars.length; i++) 
      if (originChars[i] == \' \') 
        spaceNum++;
      
    
    // 新字符数组的长度
    int newCharsLength = originChars.length + 3 * spaceNum;
    char[] newChars = new char[newCharsLength];
    int newStrIndex = 0;
    for (int index = 0; index <= originChars.length - 1; index++) 
      if (originChars[index] != \' \') 
        // 直接复制
        newChars[newStrIndex++] = originChars[index];
       else 
        // 空格则需要复制几个
        newChars[newStrIndex++] = \'C\';
        newChars[newStrIndex++] = \'O\';
        newChars[newStrIndex++] = \'D\';
        newChars[newStrIndex++] = \'E\';
      
    
    // 转成字符串
    return new String(newChars);
  

翻转单词

寻找最长回文子串

问题描述

"上海自来水来自海上",这句话不管是顺着读还是逆着读,都是一样的,这就是回文串。相信如何判断一个字符串是回文串,这个问题大家都会(根据中心对称来判断即可),现在问题升级了,给出一个字符串 s,找到 s 里面包含的最长的回文串。

例子

输入:s = abddbc
输出:bd

最直接的解法是我们对字符串中的每一段子串进行判断,也就是 “abdbdc” 可以分为以下的子串:

  • 以 a 开头的:a,ab,abd,abdd,abddb,abddbc。
  • 以 b 开头的:b,bd,bdd,bddb,bddbc。
  • 以 d 开头的:d,dd,ddb,ddbc。
  • 以 d 开头的:d,db,dbc。
  • 以 b 开头的:b,bc。
  • 以 c 开头的:c。

然后对所有的子串进行判定,是否为回文串,过程中记录最长的回文串即可。

 

分析与解答

这道题我们需要解决两件事情

第一件事情是判断回文子串

第二件事情是遍历所有的子串

查看代码

public class LongestPalindrome 

  public static void main(String[] args) 
    LongestPalindrome longestPalindrome = new LongestPalindrome();
    System.out.println(longestPalindrome.longestPalindrome("abdbdc"));
  

  // 判断是否是回文串
  public boolean isMatch(String s) 
    int len = s.length();
    for (int i = 0; i < len / 2; i++) 
      // 根据中心判断是否相等
      if (s.charAt(i) != s.charAt(len - i - 1)) 
        return false;
      
    
    return true;
  

  public String longestPalindrome(String s) 
    String result = "";
    int max = 0;
    int len = s.length();
    for (int i = 0; i < len; i++)
     for (int j = i + 1; j <= len; j++) 
      // 判断每一段子串
      String str = s.substring(i, j);
      if (isMatch(str) && str.length() > max) 
        result = s.substring(i, j);
        // 记录回文串的最大长度
        max = Math.max(max, result.length());
      
    
    return result;
  
在黑夜里梦想着光,心中覆盖悲伤,在悲伤里忍受孤独,空守一丝温暖。 我的泪水是无底深海,对你的爱已无言,相信无尽的力量,那是真爱永在。 我的信仰是无底深海,澎湃着心中火焰,燃烧无尽的力量,那是忠诚永在

以上是关于计理02组08号字符串操作算法的主要内容,如果未能解决你的问题,请参考以下文章

计理02组04号顺序查找

计理02组03号插入排序

计理02组01号选择排序

计理01组05号MySql基础课程

计理03组01号C语言基础知识

通过 Java 正则表达式提取 semver 版本字符串的片段