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;
    }
};

相关推荐
HelloReader16 分钟前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱3 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8974 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮16 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
blasit1 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮2 天前
大模型连载2:初步认识 tokenizer 的过程
算法