LeetCode系列字符串操作(一)ZigZag输出,寻找最大不重复字串长度。

ZigZag Conversion

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number
of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) should
return "PAHNAPLSIIGYIR".

分析; 此题是将一个正常的string序列用ZigZag的形式进行表示,zigzag在英文里是曲折的意思,即以锯齿状的形式将字符重新排列。此题如果很清楚这个ZigZag的形状的话是道容易的题,但是如果不知道可能就会吃亏。

这道题我大概提交了三次,因为刚开始不是很清楚这个锯齿到底是怎么一个形状,我以为没两个长列中间就只有一个元素,就如同上面的题目给出的那种形式,那么现在问题是,这个中间的一个元素位于第几行呢? 我刚开始就默认是在第二行,提交了一次,错误。然后我根据测试用例的期望值认为这个元素在倒数第二行,又提交了一次,结果还是错误。最后无奈我到网上搜索了一下该形状到底如何,最后才表白每两个长列之间是一个对角线,构成一个正方形。如下图所示:

所以很容易发现下面的规律:

对于nRows大于1的话。

1) 对于第一行和倒数第一行,后一列的元素对应的原字符串中的位置是前一列的元素+(nRows-1)*2;

2) 对于中间的行(当行数大于2的时候),如果当前列是偶数列(从0开始),那么那是奇数列的位置+(nRows-1-i)*2.如对于第二行,

第1列的Index=1+(4-1-1)*2 = 5. 而偶数列是前一列的index + 2*当前行。

上面的规律稍加推导即可得出。

下面是代码:

string convert(string s, int nRows)
{
	string temp(s);
	if (nRows < 2)
		return temp;
	int i, step;
	int j = 0;
	int count;
	for (int row = 0; row < nRows; row++)
	{
		if (row == 0 || row == nRows - 1)
		{
			step = (nRows - 1) * 2;
			for (i = row; i < s.size(); i = i + step)
			{
				temp[j++] = s[i];
			}
		}
		else  // 对于从正数第二行到倒数第二行
		{
			count = 0;
			for (i = row; i < s.size(); i = i + step)
			{
				temp[j++] = s[i];
				if (++count & 0x01)
					step = row*2;   //偶数列
				else
					step = (nRows - 1 - row) * 2;  //奇数列
			}
		}
	}
	return temp;
}

Longest Substring Without Repeating Characters

Given
a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

这道题刚开始做的时候思路还是很清晰的,两个指针分别向后,然后将每一个字符和set中的元素进行比较,如果是没有出现过那么放入set并将长度加1.这种方法简单是比较简单,但是时空复杂度都比较高,其中时间复杂是o(n^2),空间复杂度也有o(n),最后提交的时候果然超出时间限制。

下面给出一种网上比较流行的用时间换空间的做法:

用一个数组hash_charc存储所有可能出现的字符在最近一次出现的位置。两个index用来控制遍历,其中一个i用来遍历所有的字符,cur用来

保存当前未测试的,有效的子串开始的位置。

如果当前的字符在这个cur之后没有出现过,计算一下dis看是否要更新这个最大值。

如果出现过了,那么,计算这两个相同的字符之间的距离看是否要更新最大距离值。同时更新cur为之前出现的字符的位置。

下面是用c++实现的程序。

    int lengthOfLongestSubstring(string s) {
    	int hash_char[256];//保存字符上一次出现的位置
    	memset(hash_char, -1, sizeof(hash_char));

    	int curr = -1, max = 0;
    	for (int i = 0; i < s.size(); i++)
    	{
    		if (hash_char[s[i]] > curr)//如果当前字符在curr之后出现过,更新curr为上一次出现的位置
    			curr = hash_char[s[i]];
    		max = max > i - curr ? max : i - curr;  //注意这个步骤不管上面的if是否满足都会做。
    		hash_char[s[i]] = i;
    	}
    	return max;
        }
时间: 2024-10-29 19:06:20

LeetCode系列字符串操作(一)ZigZag输出,寻找最大不重复字串长度。的相关文章

通过操作指针,与指针做函数参数&#39;实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 因为p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

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

假设有一个字符串"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

【经典算法】寻找最长01字串(转自待字闺中)

这两天在微信公众号“待字闺中”中看到一个经典的面试算法,寻找最长01字串,原题目是这么说的: 给定一个数组,数组中只包含0和1.请找到一个最长的子序列,其中0和1的数量是相同的. 例1:10101010 结果就是其本身.例2:1101000 结果是110100 这个题目,看起来比较简单,一些同学可能认为题目的描述符合动态规划的特征,然后就开始用动态规划解,努力找状态转移方程.这些同学的感觉,是很正确的.但,找状态转移方程,我们要对原来的数组进行变换一下. 原来是0和1的串,我们将0都换为-1.这

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

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

[Python 3系列]字符串操作

一.处理字符串 特殊符号 ▎如何在字符串内使用特殊符号? >>> text1='His cat's name is Tom.'   File "<stdin>", line 1     text1='His cat's name is Tom.'                    ^ SyntaxError: invalid syntax >>> text1='His cat\'s name is Tom.'    ##"\

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

这是我遇到的一道校招题目: 给定一字符串只包含数字,请写一个算法,找出该字符串中的最长不重复子串(不重复是指子串中每一元素不同于子串中其他元素) 如: "120135435"最长不重复子串为 "201354" 要求用java或者c来写,我用了java. /** * 思想: *      从头开始截取字符串,只要后一个元素不在截取的字符串里,就更新截取,多截取一个元素. *       如果发现后一个元素出现在字符串里, 将最后截取的字符串存为临时结果,开始位置后移一

[leetcode]3无重复字符的最长字串

本题思路较清楚,通过一个数组记录各个位置所能够引导的最长字符串的长度即可. 稍微有一点难度在于如何向前寻找时判断已经出现了重复字符串,我采用的思路为只有当前项的长度等于当前长度时,认为尚未出现重复字符串,并更新前项长度++. 1 int max=0; 2 int st[100000]={0};//表示以它为开头的最长不重复字串长度 3 int i=0; 4 char p; 5 while(s[i]!='\0') 6 { 7 p=s[i]; 8 st[i]=1; 9 max=st[i]; 10 f

(三)Oracle字符串操作

1. Oracle字符串操作 1.1. 字符串函数 1.1.1. CONCAT和"||" CONCAT是字符串连接函数,语法是:CONCAT(char1, char2) 用于返回两个字符串连接后的结果,两个参数char1.char2是要连接的两个字符串.concat只能有两个参数,所以如果连接三个字符串时,需要两个concat函数.比如连接emp表中的name列和salary列,中间用":"隔开: SELECT CONCAT(CONCAT(name, ' : '),

lua中的字符串操作(模式匹配)

模式匹配函数 在string库中功能最强大的函数是: string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmatch(返回查找到字符串的迭代器) 这些函数都是基于模式匹配的.与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配.主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大