[题解]《算法零基础100讲》(第23讲) 字符串算法(三) - 字符串分割

知识讲解

  字符串分割实际上就是用空格来表示把一个个子串分割成独立的字符串。
分割前:
在这里插入图片描述

分割后:
在这里插入图片描述

二. 课后习题

2.1 最后一个单词的长度

题目链接:
58. 最后一个单词的长度
思路分析:
  先从尾部开始遍历,把尾部的空格除去,然后开始遍历最后的个单词并计算长度。

代码如下:

int lengthOfLastWord(char * s){
    
    
    int index = strlen(s) - 1;
    while(s[index] == ' '){
    
    
        index--;
    }
    int lenth = 0;
    while(index >= 0 && s[index] != ' '){
    
    
        lenth++;
        index--;
    }
    return lenth;
}

2.2 字符串中的单词数

题目链接:
434. 字符串中的单词数
思路分析:
  这道题很简单,我们只需判断空格即可。
代码如下:

int countSegments(char * s){
    
    
    int n = 0;
    int len = strlen(s);
    for(int i = 0; i < len; i++){
    
    
        if((i == 0 || s[i - 1] == ' ') && s[i] != ' '){
    
    
            n++;
        }
    }
    return n;
}

2.3 检查句子中的数字是否递增

题目链接:
2042. 检查句子中的数字是否递增
思路分析:
  我们可以定义一个指针数组,将每个数字字符的首地址记录下来,并把非数字的字符都改为’\0’,之后我们再把这些数字字符转化为整型的数据,进行比较即可。
代码如下:

bool areNumbersAscending(char * s){
    
    
    int n = strlen(s);
    char *Hash[n];
    int HashSize = 0;
    bool flag = true;
    for(int i = 0; i < n; i++){
    
    
    	//记录数字字符的首地址
        if(s[i] >= '0' && s[i] <= '9' && flag){
    
    
            Hash[HashSize++] = s + i;
            flag = false;
        }
        else{
    
    
        	//将非数字的字符改为\0
            if (s[i] < '0' && s[i] > '9'){
    
    
				s[i] = '\0';
			}
            flag = true;
        }
    }
    int num = atoi(Hash[0]);
    //判断是否升序。
    for(int i = 1; i < HashSize; i++){
    
    
        int k = atoi(Hash[i]);
        if(k <= num){
    
    
            return false;
        }
        num = k;
    }
    return true;
}

3.4 句子中的有效单词数

题目链接:
2047. 句子中的有效单词数
思路分析:
  我们还是用指针数组将每个单词的首地址保存,并将空格改为终止标识符,然后再根据题目所给的条件判断是否为每个单词是否为有效的单词。
代码如下:

//判断
int judge(char *s, int len) {
    
    
    if (len == 0) {
    
    
        return false;
    }
    int cnt = 0;
    for (int i = 0; i < len; i++) {
    
    
        if (isdigit(s[i])) {
    
     /* 不含数字 */
            return false;
        }
        if (s[i] == '-') {
    
     /* '-'至多一个, 且左右为小写字母 */
            if (i == len - 1 || i == 0 ||
                !islower(s[i - 1]) || !islower(s[i + 1])) {
    
    
                return false;
            }
            if (++cnt > 1) {
    
    
                return false;
            }
        }
        if (s[i] == '!' || s[i] == ',' || s[i] == '.') {
    
     /* 标点再末尾 */
            if (i != len - 1) {
    
    
                return false;
            }
        }
    }
    return true;
}

int countValidWords(char * sentence){
    
    
    int num = 0;
    int n = strlen(sentence);
    char* Hash[n];
    int HashSize = 0;
    int flag = 1;
    for(int i = 0; i < n; i++){
    
    
        if(sentence[i] != ' ' && flag){
    
    
            Hash[HashSize++] = sentence + i;
            flag = 0;
        }
        else if(sentence[i] == ' '){
    
    
            sentence[i] = '\0';
            flag = 1;
        }
    }
    for(int i = 0; i < HashSize; i++){
    
    
        if(judge(Hash[i], strlen(Hash[i]))){
    
    
            num++;
        }
    }
    return num;
}

3.5 截断句子

题目链接:
1816. 截断句子
代码如下:
这道题十分简单,我就不细讲了,代码也很易懂,直接上码。

char * truncateSentence(char * s, int k){
    
    
    int i = 0;
    for(int i = 0; i < strlen(s); i++){
    
    
        if(s[i]==' '){
    
    
            k--;
        }
        if(k==0){
    
    
            s[i]='\0';
            break;
        }
        
    }
    return s;
}

3.6 检查二进制字符串字段

题目链接:

1784. 检查二进制字符串字段
这道题难就难在作者没有将题目将清楚,其实只要理解正确了题目要求,很简单的。
我们只需要寻找有没有’01’这样的字符串出现即可,出现则范围false。
代码如下:

bool checkOnesSegment(char * s){
    
    
    return !strstr(s, "01");
}

猜你喜欢

转载自blog.csdn.net/qq_53060585/article/details/121297014