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

相关推荐
TDengine (老段)44 分钟前
TDengine C/C++ 连接器进阶指南
大数据·c语言·c++·人工智能·物联网·时序数据库·tdengine
a3535413821 小时前
设计模式-代理模式
c++·设计模式·代理模式
黎雁·泠崖2 小时前
栈与队列实战通关:3道经典OJ题深度解析
c语言·数据结构·leetcode
ytttr8738 小时前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab
AlenTech9 小时前
160. 相交链表 - 力扣(LeetCode)
数据结构·leetcode·链表
点云SLAM9 小时前
凸优化(Convex Optimization)理论(1)
人工智能·算法·slam·数学原理·凸优化·数值优化理论·机器人应用
会周易的程序员9 小时前
多模态AI 基于工业级编译技术的PLC数据结构解析与映射工具
数据结构·c++·人工智能·单例模式·信息可视化·架构
jz_ddk9 小时前
[学习] 卫星导航的码相位与载波相位计算
学习·算法·gps·gnss·北斗
放荡不羁的野指针10 小时前
leetcode150题-动态规划
算法·动态规划
sin_hielo10 小时前
leetcode 1161(BFS)
数据结构·算法·leetcode