双指针算法合集

本文介绍了两道编程题目,一是寻找字符串中出现次数最多的连续字符,二是找出以句点结尾的英文句子中最长单词。通过实例展示了如何使用C++和双指针算法解决这些问题。

目录:

acwing 771. 字符串中最长的连续出现的字符

acwing 774. 最长单词

acwing 771. 字符串中最长的连续出现的字符

求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个。

输入格式

第一行输入整数 NN,表示测试数据的组数。

每组数据占一行,包含一个不含空白字符的字符串,字符串长度不超过200。

输出格式

共一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开。

输入样例:

2
aaaaabbbbbcccccccdddddddddd
abcdefghigk

输出样例:

d 10
a 1

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string a;
    getline(cin,a);
    while(n--)
    {
        getline(cin,a); 
        char b;//b是记录最大长度的字符串
        int mx=0;
        for(int i = 0;i < a.size();i++)
        {
            int j = i,cnt=0;
            while(a[i] == a[j] && j < a.size())j++,cnt++;
            if(cnt > mx)
            {
                mx = cnt;
                b = a[i];
            }
            i = j-1;//看图
        }
        cout<<b<<" "<<mx<<endl;
    }
    return 0;
}

acwing 774. 最长单词

一个以 . 结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。

输入格式

输入这个简单英文句子,长度不超过500。

输出格式

该句子中最长的单词。如果多于一个,则输出第一个。

输入样例:

I am a student of Peking University.

输出样例:

University

思路:用双指针算法,i指向起始位置,j寻找字符串的结尾位置,j-i即为字符串的长度,比较长度,用max记下最大的长度

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    int max = 0,x,y;
    for(int i = 0;i<a.size();i++)
    {
        int j = i;
        while(a[j] !=' ' && j < a.size()) j++;
        if(max < j - i)
        {
            max = j-i+1;
            x = i;
            y = j;
        }
        i = j;
    }
    for(int i = x;i<=y && a[i] != '.';i++)cout<<a[i];
    return 0;
}

### 双指针算法的概念 双指针算法是一种常见的算法技巧,通常用于处理数组、链表等线性数据结构中的问题。该算法通过使用两个指针在数据结构中协同工作,以达到优化时间复杂度或简化逻辑的目的。相比于暴力解法,双指针算法往往能够显著减少遍历的次数,从而提升效率[^1]。 在双指针算法中,两个指针可以以不同的方式移动,例如同向移动、反向移动或快慢移动。其中,快慢指针是一种常见形式,其中一个指针(快指针)移动速度比另一个指针(慢指针)快,这种形式常用于检测链表中的环或寻找中间元素[^3]。 ### 双指针算法的常见应用场景 双指针算法广泛应用于以下场景: 1. **数组中的问题**:如寻找数组中满足特定条件的两个数,例如两数之和等于某个目标值;或者对数组进行原地操作,如删除重复元素、移动零等。 2. **链表中的问题**:双指针尤其适用于链表类问题,例如判断链表是否有环、寻找链表的中间节点、找到链表的倒数第k个节点等[^3]。 3. **字符串操作**:在字符串处理中,双指针可用于反转字符串、判断回文串、滑动窗口等问题。 4. **滑动窗口技术**:这是一种特殊的双指针应用,两个指针分别表示窗口的左右边界,随着窗口的滑动逐步更新解,适用于寻找满足条件的最小子数组或最长无重复子串等问题[^2]。 ### 快慢指针的应用示例 快慢指针是一种典型的双指针应用,常用于链表操作中。例如,寻找链表的中间节点可以通过以下方式实现: ```go // 不知道右边界的情况下寻找中间节点 func getMid(left *Node) *Node { if left == nil { return nil } fast := left slow := left for fast.Next != nil && fast.Next.Next != nil { slow = slow.Next fast = fast.Next.Next } return slow } ``` 该方法通过快指针每次移动两个节点、慢指针每次移动一个节点的方式,最终慢指针指向中间节点。 ### 双指针算法的优势 双指针算法的核心优势在于其时间复杂度通常为线性,即 O(n),避免了暴力解法中的嵌套循环所带来的 O(n²) 时间复杂度。此外,双指针算法往往可以在原地操作,减少额外空间的使用,从而提高算法的效率和空间利用率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值