labuladong日常刷题-双指针 | LeetCode 83删除排序链表中的重复元素 5最长回文子串

双指针操作链表与字符串

LeetCode 83 删除排序链表中的重复元素 2023.12.28

cpp 复制代码
ListNode* deleteDuplicates(ListNode* head) {
    /*暴力求解
        ListNode* cur = new ListNode();
        ListNode* prenode = cur;
        cur->next = head;
        cur = cur->next;
        while(cur && cur->next)
        {
            if(cur->val == cur->next->val)
            {
                if(cur->next->next)
                    cur->next = cur->next->next;
                else
                    cur->next = NULL;
            }
            else
                cur = cur->next;
        }
        return prenode->next;
        */

    //双指针求解
    //左右指针初始化均指向头节点,用右指针来遍历,左指针来存储
    ListNode* left = head;
    ListNode* right = head;
    //当右指针且右指针的next指针不为空时
    while(right && right->next)
    {
        //如果右指针与右指针的next节点值相同,
        //则如果右指针next节点的next节点存在时,左指针的next节点=右指针next节点的next节点,然后继续遍历
        //否则如果右指针next节点的next节点不存在时,说明走到头了,则给左指针的next节点指向NULL
        if(right->val == right->next->val)
        {
            if(right->next->next)
                left->next = right->next->next;
            else
                left->next = NULL;
        }
        //如果右指针与右指针的next节点值不相同,那么左右指针都继续遍历
        //实际上,左右指针都是保持同步的
        else
        {
            right = right->next;
            left = left->next;
        }
    }
    //返回头指针
    return head;
}

LeetCode 5 最长回文子串 2023.12.28

cpp 复制代码
class Solution {
    public:
    //求s字符串中的回文串,以l,r为中间两值的(奇数个字符时l=r为最中间的字符)
    string Palindrome(string s, int l, int r)
    {
        //当左侧索引>=0,右侧索引<s.size()且s[l]=s[r]时
        //l--;r++;最终退出时说明s[l+1, r-1]为回文串
        while(l >= 0 && r < s.size() && s[l] == s[r])
        {
            l--;
            r++;
        }
        //返回s[l+1, r-1]回文串
        return s.substr(l+1, r-l-1);
    }
    string longestPalindrome(string s) {
        /*暴力求解
        string longstr;
        for(int i = 0; i < s.size(); i++)
        {
            for(int j = i; j < s.size(); j++)
            {
                int sym = 0;
                for(int k = i; k <= (i+j)/2; k++)
                {
                    if(s[k] != s[j-(k-i)])
                    {
                        sym = 1;
                        break;
                    }   
                }
                if(sym == 0 && j-i+1>longstr.size())
                    longstr = s.substr(i, j-i+1);
            }
        }   
        return longstr;
        */

        //双指针求解
        //定义longstr变量存储遍历得到的最长回文串
        string longstr;
        //遍历每个以(i,i)、(i, i+1)为中心的s字符串的;将最长回文串存到longstr中
        for(int i = 0; i < s.size(); i++)
        {
            string s1 = Palindrome(s, i, i);
            string s2 = Palindrome(s, i, i+1);
            longstr = longstr.size() < s1.size() ? s1 : longstr;
            longstr = longstr.size() < s2.size() ? s2 : longstr;
        }
        return longstr;
    }
};

相关推荐
木心爱编程1 小时前
C++链表实战:STL与手动实现详解
开发语言·c++·链表
离越词1 小时前
QTday1作业
c++·qt
haogexiaole1 小时前
Dijkstra 算法
算法
papership2 小时前
【入门级-算法-6、排序算法: 插入排序】
数据结构·算法·排序算法
HAH-HAH3 小时前
【蓝桥杯 2024 国 Java A】粉刷匠小蓝
c++·学习·数学·算法·职场和发展·蓝桥杯·组合数学
得意霄尽欢3 小时前
Redis之底层数据结构
数据结构·数据库·redis
I'm a winner3 小时前
第五章:Python 数据结构:列表、元组与字典(二)
数据结构·python
我是是是是是西红柿3 小时前
游戏中的展销系统使用的数据结构
数据结构·游戏
小吴同学·3 小时前
OPC Client第10讲:实现主界面;获取初始界面传来的所有配置信息config【C++读写Excel:xlnx;ODBC;缓冲区】
c++·wxwidgets
边疆.4 小时前
【C++】继承详解
开发语言·c++·继承