找出字符串的最长不重复字串

这是我遇到的一道校招题目:

给定一字符串只包含数字,请写一个算法,找出该字符串中的最长不重复子串(不重复是指子串中每一元素不同于子串中其他元素)

如: “120135435”最长不重复子串为 "201354"

要求用java或者c来写,我用了java。

/**

* 思想:

*      从头开始截取字符串,只要后一个元素不在截取的字符串里,就更新截取,多截取一个元素。

*       如果发现后一个元素出现在字符串里, 将最后截取的字符串存为临时结果,开始位置后移一位,结束位置为开始位置下一位....

*

*      从靠前那个发生重复的字符后一位 开始 向 刚刚截取到的结束为止后一个字符 一个一个向后截取字符串....

*      如果新一轮截取的字符串比临时结果长,就更新临时结果

*      从头到尾所有部分都尝试截取之后,返回最长的那个临时结果

*

* 伪代码:

* 用start 和end 标记我截取的字符串的开始和结束的位置。 刚开始 start = 0   end = 1

* 循环:start从0到 待截取字符串的倒数第二个元素

*      0 结果字符串res ,初始为空字符串“”

*      1 从start 到end之前一个元素 把 str 截取一个临时字符串 temp

*      2 循环:

*          判断end所在字符是否在temp里面出现过

*              否: end++   更新temp赋值成新的  从start 到end前一个元素的字符串

*              是: 跳出循环

*      3 在2循环中 temp 不断被更新, 跳出2循环后,如果temp比res长,就更新res为temp,否则什么都不做

*      4 start后移一位 , end改为start的下一位

*

*/

我的代码:

 1 class Solution{
 2     public String find_longest_sub( String str ){
 3         String res = "";    //用于存找到的子序列
 4         int start = 0;    // 查找子串的开始位置
 5         int end = 1;    // 子串的结尾位置
 6
 7         while(start < str.length()-1 && end < str.length() ){    //开始位置还没到str的倒数第二个字符  就一直循环
 8             /**
 9              * 只要后一个元素不在之前截取的字符串里,end后移一位,更新字符串截取
10              */
11             String temp = str.substring(start, end);    // 截取一个临时字符串 从start到end前一位
12             while( end < str.length() && temp.indexOf( str.charAt(end) ) == -1 ){
13                 end++;
14                 temp = str.substring(start, end);
15             }
16             // 跳出循环说明下一个元素与当前截取字符串重复了
17
18             //如果当前截取比临时结果长 就更新临时结果 再重新开启一轮查找位置
19             if(temp.length() > res.length()){
20                 res = temp;
21             }
22
23             // 将新的起始位置自增1 end调整到start的下一位
24             start++;
25             end = start +1;
26
27         }
28
29         return res;
30     }
31
32 }
时间: 2024-10-12 13:55:30

找出字符串的最长不重复字串的相关文章

网上有些例子有问题,所以重新写了下 求字符串的最长不重复字串

假设有一个字符串"abcdebfgh" 那么最长不重复字串是"cdebfgh",长度是7 若是:abcdbefbghijij 应输出:befbghij 以abcbef这个串为例 用一个数据结构pos记录每个元素曾出现的下标,初始为-1 从s[0]开始,pos['a'] == -1,说明a还未出现过,令pos['a'] = 0,视为将a"加入当前串",同时长度++ 同理令pos['b'] = 1,pos['c'] = 2 到s[3]时,pos['b

找出字符串中最长不重复的子串

这题 是群里一个人发出来的  我就试着去做了下 他们说 这题蛮水的 我擦了-.- 花了很长时间 在原有的代码上 修改了很多 自己测了很多组数据 觉得应该对了 我的方法应该是 hash的思想 但这边我是直接用了map去存 也没差 假如有个字符串是abbcda 那么我们应该在遍历到第二个b的时候 计算出此时的 len 并且将在b之前的字符 重置为 未访问 我的思想就是这样的 - 觉得 看代码可以读懂. 1 #include <iostream> 2 #include <cstring>

找出字符串的最长不重复子串,输出最大的子字符串

比如: ababcdebc,那他最大的子字符串就是:abcde using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 {     class Program {         static void Main(string[] args) {         

找出字符串中最长不重复子串

public class AE { public static void main(String[] args) { //String s = "abacdecfgab"; String s = "abacdbe"; System.out.println(noDuplicate(s)); } public static String noDuplicate(String str) { String sub = ""; String result

找出字符串中第一个不重复的字符(JavaScript实现)

如题~ 此算法仅供参考,小菜基本不懂高深的算法,只能用最朴实的思想去表达. 1 //找出字符串中第一个不重复的字符 2 // firstUniqueChar("vdctdvc"); --> t 3 function firstUniqueChar(str){ 4 var str = str || "", 5 i = 0, 6 k = "", 7 _char = "", 8 charMap = {}, 9 result =

字符串中最长的不重合字串长度

例子 "abmadsefadd"  最长长度为5 "avoaid"           最长长度为3 思路 空间换时间hashTable,标准下其实位置beg.初始化全局最大值0.开辟字符数组,起初标为0. 访问数组时 如果该字符在hashTable对应的哈希值为1,则计算当前位置到beg的距离,并且把beg赋值为当前位置.如果大于全局最大值,则替换全局最大值 如果该字符在hashTable对应的哈希值为0,则置1 参考代码 #include <iostrea

最长无重复字串

给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1. 给定 "pwwkew" ,最长子串是 "wke" ,长度是3.请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串. class Solution

本程序找出字符串数组 String[] arr = {“welcome”, “china”, “hi”, “congratulation”, “great”} 中的长度最大的元素,并打印输出。

/** * Homework14 * * @Description:本程序找出字符串数组 String[] arr = {"welcome", "china", "hi", * "congratulation", "great"} 中的长度最大的元素,并打印输出. * StringDemo01 * * @author  * * email: [email protected] 2017年4月18日下午6:3

c语言代码编程题汇总:找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值

找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值 程序代码如下: 1 /* 2 2017年3月8日08:39:16 3 功能:找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值 4 */ 5 6 #include"stdio.h" 7 int main (void) 8 { 9 int i = 0, j = 0; 10 char a[100]; 11 char ch; 12 int num = 0; 13 14 printf ("please inp