[解题报告](第21讲) 字符串算法(一) - 字符串遍历(2)

简介: [解题报告](第21讲) 字符串算法(一) - 字符串遍历

1876. 长度为三且各字符不同的子字符串


1876. 长度为三且各字符不同的子字符串

https://leetcode-cn.com/problems/substrings-of-size-three-with-distinct-characters/


思路


从第3个元素开始往后扫描,看看前三个字母一样不 然后做统计就好了。


int countGoodSubstrings(char * s){
    if(!s[0]||!s[1]||!s[2]) return 0;//长度小于3直接返回
    int ans = 0;
    for(int i = 2;s[i];i++)    //遍历统计
        if(s[i] != s[i - 1]&&s[i] != s[i-2] && s[i - 1] != s[i - 2]) ans++;
    return ans;
}

结果分析

image.png


满意!


520. 检测大写字母


520. 检测大写字母

https://leetcode-cn.com/problems/detect-capital/

思路


我一直以为我写过这个题解,,看来没有,,好吧 这是昨天c的题


扫描所有的大写个数,并分三种情况


1.大写个数为0 就返回true


2.大写个数等于字符串长度 返回true


3.大写个数为0,且第一个为大写  则返回true


其它都是false


bool detectCapitalUse(char * word){
    int upnum = 0,i = 0;
    for(i = 0;word[i];++i){
        if(word[i] <= 'Z')    upnum++;//判断大写数量,因为小写比大写大 所以可以这么写
    }
    if(!upnum)  return true;
    else if(upnum == 1 &&word[0] <='Z') return true;//判断第一位是不是大写
    else if(upnum == i) return true;
    return false;
}

结果分析

image.png


满意?


709. 转换成小写字母


709. 转换成小写字母

https://leetcode-cn.com/problems/to-lower-case/


思路


没难度,从前到后扫描。扫描到大写就加上' '就好了,为啥看知识点。。。


char * toLowerCase(char * s){
    for(int i = 0;s[i];i++)
        if(s[i]>='A'&&s[i]<='Z')    s[i]+= ' ';//扫描到大写,转换
    return s;
}

结果分析

image.png


行了


1704. 判断字符串的两半是否相似


1704. 判断字符串的两半是否相似

https://leetcode-cn.com/problems/determine-if-string-halves-are-alike/


思路


扫描一遍字符串记录长度,再次扫描前半段和后半段,统计其中的元音数量,返回两者判等的结果。


注:我创建了hash表加快了判定速度,也可以不用用循环写。


bool halvesAreAlike(char * s){
    int count = 0,ans1 = 0, ans2 = 0;
    bool f[26];     //创建元音数组
    memset(f,0,sizeof(f));
    f[0] = 1;f[4] = 1;f[8] = 1;f[14] = 1;f[20] = 1; //对应aeiou
    while(s[count]) count++;    //计算数组长度
    for(int i = 0;i < count/2;++i)          //统计前半段元音数量
        if(s[i] >= 'a' && f[s[i] - 'a']) ans1 ++;
        else if(s[i] <= 'Z'&&f[s[i] - 'A']) ans1++;
    for(int i = (count+1) / 2;i < count;i++)    //判断后半段元音数量
        if(s[i] >= 'a'&&f[s[i] - 'a']) ans2++;
        else if(s[i] <= 'Z'&&f[s[i] - 'A']) ans2++;
    return ans1 == ans2;
}


结果分析

image.png


做人嘛。要开心


1844. 将所有数字用字符替换


1844. 将所有数字用字符替换

https://leetcode-cn.com/problems/replace-all-digits-with-characters/


思路


直接按照要求进行转换就好了嘛。


char * replaceDigits(char * s){
    for(int i = 0;s[i];++i)//遍历修改
        if(s[i] >='0'&&s[i] <='9') //找到修改
            s[i] = s[i - 1] + (s[i] -'0');
    return s;
}

结果分析

image.png


有趣


1805. 字符串中不同整数的数目


1805. 字符串中不同整数的数目

https://leetcode-cn.com/problems/number-of-different-integers-in-a-string/


思路


其实按照题目要求来就好了


1.拆分字符串


2.去除头部0


3.去除重复元素的统计


int numDifferentIntegers(char * word){
    bool flag = false;
    int counti = 0,countj = 0;
    char spit[500][1001];//记录拆分后的字符串
    for(int i = 0;i == 0||word[i - 1];++i)  //拆分字符串
        if(word[i] >= '0' && word[i] <= '9'){
            flag = true;
            spit[counti][countj++] = word[i];
        }
        else{
            if(flag){
                spit[counti++][countj] = 0;
                countj = 0;
                flag = false;
            }
        }
    for(int i = 0;i < counti;i++){  //删除头部的0
        int first = 0;
        while(spit[i][first] == '0')    first++;
        if(first != 0)
            for(int j = first;spit[i][j - 1];++j)
                spit[i][j-first] = spit[i][j];
    }
    //将重复元素做标记
    for(int i = 0;i < counti;i++)
        for(int j = i + 1;j<counti;j++)
            if(!strcmp(spit[i],spit[j]))    spit[j][0] = '#';
    //减去重复元素
    int ans = counti;
    for(int i = 0;i < counti;i++)
        if(spit[i][0] == '#') ans--;
    return ans;
}


结果分析

image.png


还行


写在最后


       有点卷不动了,好多考试都来了,

相关文章
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
49 2
|
6月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
3月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
3月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
97 5
|
3月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
61 2
|
3月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
104 0
|
4月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
135 1
两个字符串匹配出最长公共子序列算法
|
4月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
168 0
|
4月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
46 0
|
4月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)

热门文章

最新文章