IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【解题报告】《算法零基础100讲》(第25讲) 字符串算法(五) - 字符串反转 -> 正文阅读

[数据结构与算法]【解题报告】《算法零基础100讲》(第25讲) 字符串算法(五) - 字符串反转

目录

? 一、算法思想

? 二、反转字符串

?? 三、反转单词前缀

? 四、反转字符串中的元音字母

? 五、反转字符串中的单词Ⅲ

? 六、仅仅反转字母

?? 七、反转字符串Ⅱ

? 八、翻转单词序列


??

一、算法思想

????????字符串反转最常用的方法是使用双指针,分别指向字符串的开头和结尾,依次进行交换即可

void swap(char* a, char*b)
{
    char* tmp = *a;
    *a = *b;
    *b = tmp;
}
void reverseString(char* s, int sSize)
{
    int left = 0;
    int right = sSize - 1;
    while(left < right)
    {
        swap(&s[left],&s[right]);
        left++;
        right--;
    }
}

有了上面的知识我们就可以开始做题了。

二、反转字符串

https://leetcode-cn.com/problems/reverse-string/icon-default.png?t=LA92http://反转字符串①题目呈现

难度:★☆☆☆☆

②参考题解

void reverseString(char* s, int sSize)
{
    int left = 0;
    int right = sSize - 1;
    while(left < right)
    {
        int tmp = s[left];
        s[left] = s[right];
        s[right] = tmp;
        left++;
        right--;
    }
}

??三、反转单词前缀

反转单词前缀icon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-prefix-of-word/

①题目呈现?

难度:★☆☆☆☆

【分析】和上一题相比只需要多一个对于ch的判断即可

②参考代码

void swap(char* a, char*b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

char * reversePrefix(char * word, char ch)
{
    int i = 0;
    while(word[i] && word[i] != ch)
    {
        i++;
    }
    printf("%d ",i);
    if(!word[i])
        return word;
    int p = 0;
    while(p < i)
    {
        swap(&word[p],&word[i]);
        p++;
        i--;
    }
    return word;
}

?四、反转字符串中的元音字母

反转字符串中的元音字母icon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-vowels-of-a-string/①题目呈现

难度:?★☆☆☆☆

【分析】只要加上对元音的判断即可

②参考代码

char vowel[] = "aeiouAEIOU";

bool isVowel(char ch) {
    for (int i = 0; vowel[i]; i++) {
        if (vowel[i] == ch) {
            return true;
        }
    }
    return false;
};

char* reverseVowels(char* s) {
    int n = strlen(s);
    int i = 0, j = n - 1;
    while (i < j) {
        while (i < n && !isVowel(s[i])) {
            ++i;
        }
        while (j > 0 && !isVowel(s[j])) {
            --j;
        }
        if (i < j) {
            char* tmp = s[i];
            s[i] = s[j], s[j] = tmp;
            ++i;
            --j;
        }
    }
    return s;

?五、反转字符串中的单词Ⅲ

反转字符串中的元音单词Ⅲicon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/①题目呈现

?难度:★☆☆☆☆

【分析】以空格作为每个字符串的分界,所以本质上还是字符串反转

?②参考代码

void reverse(char*s ,int left, int right)
{
    while(left < right)
    {
        int tmp = s[left];
        s[left] = s[right];
        s[right] = tmp;
        left++;
        right--;
    }
}
char * reverseWords(char * s)
{
    int len = strlen(s);
    int fast = 1;
    int slow = 0;
    while(fast < len)
    {
        if(s[fast] == ' '  )//还应该注意到最后面没有空格
        {
            reverse(s, slow ,fast - 1);
            slow = fast + 1;
        }
        fast++;
    }
    reverse(s, slow, fast - 1);
    return s;
}

?

?六、仅仅反转字母

仅仅反转字母https://leetcode-cn.com/problems/reverse-only-letters/icon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-only-letters/①题目呈现

难度:?★☆☆☆☆

?【分析】我们在用指针遍历的时候,遇到字母才发生交换

②参考代码

bool is_c(char c)
{
    return (c >= 'a' && c <= 'z') || (c >='A' && c <='Z');
}

void swap(char*a,char*b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

char * reverseOnlyLetters(char * s)
{
    int slow = 0;
    int fast = strlen(s) - 1;
    while(slow < fast)
    {
        while(slow < fast && !is_c(s[slow]))
        {
            slow++;
        }
        while(slow < fast && !is_c(s[fast]))
        {
            fast--;
        }

        swap(&s[slow],&s[fast]);

        fast--;
        slow++;
    }
    return s;
}

??七、反转字符串Ⅱ

反转字符串Ⅱicon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-string-ii/①题目呈现

难度:?★★☆☆☆

【分析】在反转的时候还需要判断个数,我们交给while去循环就好了

②参考代码

void swap(char*left,char*right)
{
    while(left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}

char * reverseStr(char * s, int k)
{
    int  p = 0;
    int len = strlen(s);
    while(len >= 2*k)
    {
        swap(&s[p], &s[p + k - 1]);
        len -= 2*k;
        p += 2*k;
    }
    if(len >=k)
    {
        swap(&s[p],&s[p + k - 1]);
        len -= k;
        p += k;
    }
    else if(len >= 2)
        swap(&s[p],&s[p + len - 1]);
    return s;
}

?

?八、翻转单词序列

翻转单词序列icon-default.png?t=LA92https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/①题目呈现

?难度:★★★☆☆

【分析】不同于前面都是字母进行交换,这里我们需要对单词进行交换。那我们怎么解决呢??我们可以从后往前遍历,当找到一个单词的开头的时候就将他放入res数列中,从而实现了逆序。只不过这里我们还需要额外考虑空格的干扰

②参考代码

char* reverseWords(char* s)
{
    int len = strlen(s); 
    if(len == 0)//什么都没有的情况
        return "";
    int left = 0;
    int right = len - 1;
    char blank[] = " ";
    char* ans = (char*) malloc(sizeof(char) * len + 1);
    memset(ans,0,sizeof(char) * len  + 1);
    while(s[left] == ' ' && left < right)//找到自左向右第一个单词
    {
        left++;
    }
    while(s[right] == ' ' && right > left)//找到自右向左第一个单词
    {
        right--;
    }
    if(right == left && s[left] == ' ')// 全是空格的情况
        return "";
    s[right + 1] = '\0';//删除末尾多余空格
    while(right > left)
    {
        if(s[right] == ' ')
            s[right] = '\0';
        else if(s[right-1] == ' ')//找到当前单词的开头
        {
            strcat(ans,&s[right]);
            strcat(ans,blank);
        }
        right--;
    }
    strcat(ans,&s[left]);
    return ans;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:05:28  更:2021-11-16 19:07:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:31:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码