【算法之双指针I】leetcode344.反转字符串

news2024/9/22 21:36:45

344.反转字符串

力扣题目链接

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

解题思路

  1. 使用双指针

Java实现

class Solution_LC344 {
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length - 1;
        while (left < right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }
}

541. 反转字符串II

力扣题目链接

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
输入:s = "abcdefg", k = 2
输出:"bacdfeg"

解题思路

  1. 每次移动2k,修改前k个字符。

Java实现

class Solution {
    public String reverseStr(String s, int k) {

        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i += 2 * k) {
            int left = i;
            int right = Math.min(left + k - 1, chars.length - 1);
            while (left < right) {
                char tmp = chars[left];
                chars[left] = chars[right];
                chars[right] = tmp;
                left++;
                right--;
            }
        }
        return String.valueOf(chars);
    }
}

剑指Offer 05.替换空格

力扣题目链接

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

输入:s = "We are happy."
输出:"We%20are%20happy."

解决思路

  1. 考虑的是使用新的数组或者字符串

Java实现

方式1

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                sb.append("%20");
            } else {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}

方式2

class Solution {
    public String replaceSpace(String s) {
        int length = s.length();
        char[] array = new char[length * 3];
        int size = 0;
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (c == ' ') {
                array[size++] = '%';
                array[size++] = '2';
                array[size++] = '0';
            } else {
                array[size++] = c;
            }
        }
        String newStr = new String(array, 0, size);
        return newStr;
    }
}

151.翻转字符串里的单词

力扣题目链接

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

**注意:**输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

输入:s = "the sky is blue"
输出:"blue is sky the"

解决思路

  1. 去除多余的空格,去除字符前后的空格,以及中间的空格缩小至1个。
  2. 修改字符串中的每一个切分的单词。先计算出单词的末尾,翻转单词,计算单词的起始位。

Java实现

package com.charles.hash;

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = trimSpaces(s);
        sb.reverse();
        int length = sb.length();
        int start = 0;
        for (int i = 0; i < length; i++) {
            while (i < length && sb.charAt(i) != ' ') {
                i++;
            }
            int end = i - 1;
            while (start < end) {
                char tmp = sb.charAt(start);
                sb.setCharAt(start, sb.charAt(end));
                sb.setCharAt(end, tmp);
                start++;
                end--;
            }
            start = i + 1;
        }
        return sb.toString();
    }

    private StringBuilder trimSpaces(String s) {
        int left = 0;
        int right = s.length() - 1;
        while (left <= right && s.charAt(left) == ' ') {
            left++;
        }
        while (left <= right && s.charAt(right) == ' ') {
            right--;
        }
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = left; i <= right; i++) {
            if (s.charAt(i) != ' ') {
                stringBuilder.append(s.charAt(i));
            } else if (stringBuilder.charAt(stringBuilder.length() - 1) != ' ') {
                stringBuilder.append(s.charAt(i));
            }
        }
        return stringBuilder;
    }
}

剑指 Offer 58-II.左旋转字符串

力扣题目链接

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

输入: s = "abcdefg", k = 2
输出: "cdefgab"

解决思路

  1. 使用字符串切割。

Java实现

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(s.substring(n));
        stringBuilder.append(s.substring(0, n));
        return stringBuilder.toString();
    }
}

28. 找出字符串中第一个匹配项的下标

力扣题目链接

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

解决思路

  1. 计算出前缀树数组。
  2. next[i] 表示 i(包括i)之前最长相等的前后缀长度。如abab最长相等前后缀是ab。定义两个指针i和j,j指向前缀末尾位置,i指向后缀末尾位置。
  3. j = next[j - 1],因为前后缀相等,所以j-1所在位置的前后缀长度是next[j - 1],所以下一个匹配的字符串可以从next[j - 1]去匹配。

Java实现

class Solution_LC28 {

    public int strStr(String haystack, String needle) {
        int n = haystack.length(), m = needle.length();
        int[] next = new int[m];
        for (int i = 1, j = 0; i < m; i++) {
            while (j > 0 && needle.charAt(i) != needle.charAt(j)) {
                j = next[j - 1];
            }
            if (needle.charAt(i) == needle.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        for (int i = 0, j = 0; i < n; i++) {
            while (j > 0 && haystack.charAt(i) != needle.charAt(j)) {
                j = next[j - 1];
            }
            if (haystack.charAt(i) == needle.charAt(j)) {
                j++;
            }
            if (j == m) {
                return i - m + 1;
            }
        }
        return -1;
    }
}

459.重复的子字符串

力扣题目链接

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

解决思路

  1. 案例:abababab或者abcabcabc
  2. 使用kmp算法
  3. 当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。

Java实现

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int n = s.length();
        int[] next = new int[n];
        for (int i = 1, j = 0; i < n; i++) {
            while (j > 0 && s.charAt(i) != s.charAt(j)) {
                j = next[j - 1];
            }
            if (s.charAt(i) == s.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        return next[n - 1] != 0 && n % (n - next[n - 1]) == 0;
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代理服务器】Squid代理服务器应用

目录 一、Squid代理服务器1.1代理的工作机制1.2代理服务器的概念1.3代理服务器的作用1.4Squid 代理的类型 二、安装Squid服务2.1编译安装Squid2.2修改 Squid 的配置文件2.3Squid运行控制2.4创建Squid服务脚本2.5 构建传统代理服务器2.6更改防火墙规则2.7验证 三、构建透明代理服…

Keil MDK 5 仿真STM32F4报错no ‘read‘ permission

问题描述 MDK软件模拟仿真提示没有读写权限&#xff0c;只能单步运行。error提示&#xff1a; *** error 65: access violation at 0x40023C00 : no read permission 关于Keil MDK 5 仿真STM32F4报错no ‘read’ permission的解决方法 Vision 调试器为所有 ARM7、ARM9、Corte…

怎样在文章末尾添加尾注(将尾注的数字变为方括号加数字)

在进行文章编写或者需要添加注解时&#xff0c;需要进行尾注的添加&#xff0c;下面将详细说明如何进行尾注的添加 操作 首先打开需要进行添加尾注的文档&#xff0c;将光标移动至需要进行添加尾注的文字后。 紧接着在上方工具栏中&#xff0c;选择引用&#xff0c;在引用页…

4.FreeRTOS系统配置文件详解(FreeRTOSConfig.h)

目录 一、基础配置选项 二、内存分配相关定义 三、钩子函数的相关定义 四、运行时间和任务状态统计相关定义 五、软件定时器相关配置 FreeRTOSConfig.h配置文件的作用&#xff1a; 对FreeRTOS进行功能配合和裁剪&#xff0c;以及API函数的使能 对于FreeRTOS配置文件主要…

如果制作投票选举投票制作制作一个投票在线制作投票

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

CORS如何实现跨域(前端+后端代码实例讲解)

书接上回&#xff0c;上一篇文章讲解了用 jsonp 来解决跨域问题&#xff0c;这篇文章讲解另外一种方法也可以解决跨域问题&#xff0c;那就是CORS&#xff08;跨源资源共享&#xff09;。 什么是CORS&#xff1f; 下面是官方的解释&#xff1a;跨源资源共享&#xff08;CORS&a…

刚去了家新公司,发现个个都是卷王 , 想离职了。。

个个都说想躺平了&#xff0c;可是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;才工作一年&#xff0c;跳槽到我们公司起薪15K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

性能测试什么时候开始?性能测试流程介绍

目录 性能测试什么时候开始? 一、制定性能测试目标 二、性能测试场景获取 三、性能测试数据确定 四、性能测试用例设计 五、性能测试环境准备与搭建 六、做脚本 七、跑场景 八、做监控 九、分析调优 十、回归测试 十一、出图写报告 总结&#xff1a; 性能测试什么…

STM32——建工程

文章目录 一、建工程步骤1. 创建一个工程文件2. 里面创建四个文件3. Lib&#xff1a;存放标准库的.c和.h文件&#xff0c;其中inc放置.h文件&#xff0c;src放置.c文件4. Startup中存放驱动文件5.User文件中包含以下路径以下文件6.创建工程Project 一、建工程步骤 以STM32F10X…

若依不分离,弹层自定义按钮

记录下遇到的两种情况 第一种&#xff1a;点击按钮&#xff0c;打开第三方链接去支付&#xff0c;因为只需要显示一个关闭按钮 代码&#xff1a; // 表格操作列 {title: 操作,align: center,formatter: function (value, row, index) {var actions [];if (row.status1) {acti…

NAMD分子动力学模拟在生物及材料计算中的应用专题

第一天 时间 :第一天上午 内容:一&#xff1a;分子动力学相关软件及Linux入门 目标&#xff1a;了解NAMD软件&#xff0c;掌握NAMD安装环境&#xff0c;了解Linux语言 二&#xff1a;VMD可视化软件的安装和使用 三&#xff1a;研究对象模型获取&#xff0c;构建以及优化 主要…

7-WebApis-5

Web APIs - 5 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&#xff…

LeetCode 445.两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 https://leetcode.cn/problems/add-two-numbers-ii/description/ c…

Elasticsearch全⽂检索

以下说明&#xff1a;其中比喻都是以mysql为模板进行比较说明 一.lucene 1.jar包环境准备 <!-- 引入Lucene核心包及分词器包 --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>…

82、基于stm32单片机音乐喷泉设计播放器频谱彩灯系统设计(程序+原理图+参考论文+开题报告+任务书+设计资料+元器件清单等)

摘 要 随着人们生活水平的提高和建立绿色城市的向往&#xff0c;音乐喷泉以其独特的魅力和特殊的功能&#xff0c;愈来愈成为休闲娱乐产业中的一项重要产品,音乐喷泉的兴建也越来越多。 根据目前音乐喷泉的发展现状&#xff0c;介绍了一个以STM32单片机为核心的小型音乐喷泉控…

Fiddler过滤器 Filters 详解

目录 前言&#xff1a; 一、 Hosts 过滤 &#xff08;较常用&#xff09; 二、Client Process 过滤&#xff08;客户端进程过滤&#xff0c;通过配置只过滤/不过滤哪些进程的请求。用的不多&#xff09; 三、Request Headers &#xff08;根据请求头信息进行过滤。常用&…

wireshark抓包工具实战

目录 参考一、关于Wireshark二、下载及安装三、基本概念每层类型Ethernet以太网层&#xff08;MAC地址&#xff09;协议目的地址 Internet网络层协议报文 Transmission传输层协议 三、tcp抓包三次握手连接四次握手断开http协议请求协议包应答协议包文件类型 参考 网络抓包工具…

Docker容器技术 详解!!!

目录 一、概述 &#xff08;一&#xff09;docker介绍 &#xff08;二&#xff09;为什么使用Docker &#xff08;三&#xff09;docker优势 1、运行环境的一致性&#xff1a; 2、更快速地启动部署&#xff1a; 3、更好的隔离性&#xff1a; 4、弹性伸缩、快速扩展&…

FreeRTOS_任务切换

目录 1. RendSV 异常 2. FreeRTOS 任务切换场合 2.1 执行系统调用 2.2 系统滴答定时器&#xff08;SysTick&#xff09;中断 3. PendSV 中断服务函数 4. 查找下一个要运行的任务 4.1 通用方法 4.2 硬件方法 5. FreeRTOS 的时间片调度 6. 时间片调度实验 6.1 实验程序…

Pushgetway安装和使用

1、Pushgetway安装和使用 1.1 Pushgateway是什么 pushgateway 是另一种数据采集的方式&#xff0c;采用被动推送来获取监控数据的prometheus插件&#xff0c;它可以单独运行在 任何节点上&#xff0c;并不一定要运行在被监控的客户端。 首先通过用户自定义编写的脚本把需要监…