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

相关推荐
前端摸鱼匠2 小时前
【AI大模型春招面试题11】什么是模型的“涌现能力”(Emergent Ability)?出现条件是什么?
人工智能·算法·ai·自然语言处理·面试·职场和发展
sqmw2 小时前
MFCMouseEffect:把桌面输入反馈这件事,做成一个真正可扩展的引擎
c++·插件·引擎·鼠标特效·键鼠指示·鼠标伴宠
MORE_772 小时前
leecode-合并区间-贪心算法
算法·贪心算法
沈阳信息学奥赛培训2 小时前
#undef 指令 (C/C++)
c语言·开发语言·c++
2401_873204652 小时前
分布式系统安全通信
开发语言·c++·算法
sw1213894 小时前
C++中的代理模式实战
开发语言·c++·算法
ballball~~4 小时前
ISP-CCM(Color Correction Matrix)
图像处理·数码相机·算法
sheeta19984 小时前
LeetCode 每日一题笔记 日期:2025.03.24 题目:2906.构造乘积矩阵
笔记·leetcode·矩阵
Sunshine for you5 小时前
实时操作系统中的C++
开发语言·c++·算法
史蒂芬_丁5 小时前
C++深度拷贝例子
java·开发语言·c++