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 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
-森屿安年-1 小时前
按身高排序
c++·算法
程序员清风1 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
无定义_1 小时前
Codeforces Round 1124 (Div. 2)
算法
(Charon)2 小时前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试
朔北之忘 Clancy2 小时前
青少年软编等考七级题解目录
开发语言·c++·青少年编程·gesp·csp·信奥赛·noi
汉克老师3 小时前
GESP2026年9月认证C++七级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程
Mr_Macallon3 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
垆边人似月.3 小时前
任务混部(200 分档)
算法
言乐63 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先