C#算法之无重复字符的最长子串
作者:痴者工良 发布时间:2021-05-24 21:56:59
标签:C#,无重复,字符,最长子串
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
要注意字符串为空、变量为null、字符串长度 Length = 1 等情况。
测试实例
输入
" "
"au"
"abcabcbb"
"bbbbb"
"pwwkew"
"aab"
预期结果分别是 1,2,3,1,3,2
代码格式模板
public class Solution {
public int LengthOfLongestSubstring(string s) {
}
}
笔者的代码仅供参考
使用最笨的方式,200ms左右
public class Solution {
public int LengthOfLongestSubstring(string s) {
if (s == null || s == "")
return 0;
char[] a = s.ToCharArray(); //字符串转为字符数组
int start = 0; //区间开始位置
int stop = 0; //区间结束位置
int newMax = 1; //当前区间数
int max = 1; //区间最大个数
for (stop = 1; stop < a.Length; stop++) //每次向后移动一位
{
bool b = false; //是否存在重复
for (int i = start; i < stop; i++) //检查当前元素在区间是否有相同值
{
if (a[stop] == a[i]) //如果stop+1位在区间找到相同的字符
{
char ls = a[stop];
if (newMax > max) max = newMax;
start = i + 1; //区间开始位置重置
newMax = stop - start + 1;
b = true;
break;
}
}
if (b == false)
newMax += 1;
}
if (newMax > max) max = newMax;
return max;
}
}
完整测试代码(控制台)
using System;
namespace ConsoleApp1
{
public class Testa
{
public int LengthOfLongestSubstring(string s)
{
if (s == null || s == "")
return 0;
char[] a = s.ToCharArray(); //字符串转为字符数组
int start = 0; //区间开始位置
int stop = 0; //区间结束位置
int newMax = 1; //当前区间数
int max = 1; //区间最大个数
for (stop = 1; stop < a.Length; stop++) //每次向后移动一位
{
bool b = false; //是否存在重复
for (int i = start; i < stop; i++) //检查当前元素在区间是否有相同值
{
if (a[stop] == a[i]) //如果stop+1位在区间找到相同的字符
{
char ls = a[stop];
if (newMax > max) max = newMax;
start = i + 1; //区间开始位置重置
newMax = stop - start + 1; //重新设置区间数
b = true;
break;
}
}
if (b == false) ////没有重新设置区间数时加1
newMax += 1;
}
if (newMax > max) max = newMax;
return max;
}
}
class Program
{
static void Main(string[] args)
{
Testa t1 = new Testa(); //正确结果
Console.WriteLine(t1.LengthOfLongestSubstring(" ")); //1
Console.WriteLine(t1.LengthOfLongestSubstring("au")); //2
Console.WriteLine(t1.LengthOfLongestSubstring("abcabcbb")); //3
Console.WriteLine(t1.LengthOfLongestSubstring("bbbbb")); //1
Console.WriteLine(t1.LengthOfLongestSubstring("pwwkew")); //3
Console.WriteLine(t1.LengthOfLongestSubstring("aab")); //2
Console.ReadKey();
}
}
}
使用哈希集合,速度更快,100ms-150ms
public int LengthOfLongestSubstring(string s)
{
int n = s.Length;
HashSet<char> set = new HashSet<char>(); //集合
int ans = 0, start = 0, stop = 0; //ans为字符串长度,starp区间起点,stop区间终点
while (start < n && stop < n)
{
// try to extend the range [i, j]
if (!set.Contains(s[stop]))
{
set.Add(s[stop++]);
ans = Math.Max(ans, stop - start);
//或者ans = ans > (stop - start) ? ans : (stop - start)
}
else
{
set.Remove(s[start++]);
}
}
return ans;
}
完整控制台测试代码
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
public class Solution
{
public int LengthOfLongestSubstring(string s)
{
int n = s.Length;
HashSet<char> set = new HashSet<char>(); //集合
int ans = 0, start = 0, stop = 0; //ans为字符串长度,starp区间起点,stop区间终点
while (start < n && stop < n)
{
// try to extend the range [i, j]
if (!set.Contains(s[stop]))
{
set.Add(s[stop++]);
ans = Math.Max(ans, stop - start);
//或者ans = ans > (stop - start) ? ans : (stop - start)
}
else
{
set.Remove(s[start++]);
}
}
return ans;
}
}
class Program
{
static void Main(string[] args)
{
Solution t1 = new Solution(); //正确结果
Console.WriteLine(t1.LengthOfLongestSubstring(" ")); //1
Console.WriteLine(t1.LengthOfLongestSubstring("au")); //2
Console.WriteLine(t1.LengthOfLongestSubstring("abcabcbb")); //3
Console.WriteLine(t1.LengthOfLongestSubstring("bbbbb")); //1
Console.WriteLine(t1.LengthOfLongestSubstring("pwwkew")); //3
Console.WriteLine(t1.LengthOfLongestSubstring("aab")); //2
Console.ReadKey();
}
}
}
来源:https://www.cnblogs.com/whuanle/p/10342416.html
0
投稿
猜你喜欢
- 在Java解析XML文件的过程中,有时需要获取符合某些特定条件的节点,以下是实现代码。import javax.xml.xpath.XPat
- JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为
- 自动装配的含义在SpringBoot程序main方法中,添加@SpringBootApplication或者@EnableAutoConfi
- Java中字符串中子串的查找共有四种方法,如下:1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串
- 本文实例讲述了Android获取手机屏幕大小的方法。分享给大家供大家参考,具体如下:这里主要用了三个对象TextView ,Button ,
- 本文实例讲述了Java基于IO流读取文件的方法。分享给大家供大家参考,具体如下:public static void readFile(){
- 前言在上篇文章讲到了如何配置单数据源,但是在实际场景中,会有需要配置多个数据源的场景,比如说,我们在支付系统中,单笔操作(包含查询、插入、新
- Mybatis配置返回为修改影响条数mybatis执行update()方法默认返回为匹配的更新记录条数,现在需要将update()方法修改为
- C#串口模块的使用。使用VS .net框架下WinForm程序应用开发。C#开发的串口通信小工具。相比于QT添加的串口类,WinForm是通
- java获取map中value最大值public static void main(String[] args) throws Interr
- Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单。最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装Fl
- 本文实例讲述了C#基于QRCode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:二维码早就传遍大江南北了,总以为它是个神
- 1.memchrmemchr的函数声明:void *memchr(const void *str, int c, size_t n);作用:
- 本文实例为大家分享了opencv利用视频的前n帧求平均图像的具体代码,供大家参考,具体内容如下自己写的哈,可以用该小程序对视频求解平均模型。
- 本文实例讲述了C#简单聊天程序实现方法。分享给大家供大家参考。具体如下:假如有服务器端程序,ChatServer和客户端程序ChatClie
- 本文实例讲述了C#模拟window操作鼠标的方法。分享给大家供大家参考。具体实现方法如下:using System;using System
- 从事过ASP.NET开发的可能都会接触到一些图表控件,比如OWC、ZendGraph等等,这些控件都有一个特点,那就是我们可以像操作.NET
- 前言在日常编码中,有了ide的支持,我们已经很少直接在命令行中直接执行java XXX命令去启动一个项目了。然而我们有没有想过,一个简单的j
- java parseInt()
- 前言:Android开发中,自定义View实现自己想要的效果已成为一项必备的技能,当然自定义View也是Android开发中比较难的部分,涉