/**
* Longest Substring Without Repeating Characters
* 無重複字符的最長子串
*/
#include <string.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
int lengthOfLongestSubstring1(string s) {
map<char, int> m;
int maxLen = 0;
int lastRepeatPos = -1;
for(int i=0; i<s.size(); i++){
if (m.find(s[i])!=m.end() && lastRepeatPos < m[s[i]]) {
lastRepeatPos = m[s[i]]; //m.find()將需要匹配的數組排序或者添加到m中 逐個迭代數組
}
if ( i - lastRepeatPos > maxLen ){
maxLen = i - lastRepeatPos; //i表示字符是否出現重複,迭代lastRepeatPos部分
}
m[s[i]] = i;
}
return maxLen;
}
//don't use <map>
int lengthOfLongestSubstring(string s) {
const int MAX_CHARS = 256;
int m[MAX_CHARS];
memset(m, -1, sizeof(m));
int maxLen = 0;
int lastRepeatPos = -1;
for(int i=0; i<s.size(); i++){
if (m[s[i]]!=-1 && lastRepeatPos < m[s[i]]) {
lastRepeatPos = m[s[i]];
}
if ( i - lastRepeatPos > maxLen ){
maxLen = i - lastRepeatPos;
}
m[s[i]] = i;
}
return maxLen;
}
int main(int argc, char** argv)
{
string s = "abcabcbb";
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
s = "bbbbb";
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
s = "bbabcdb";
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
if (argc>1){
s = argv[1];
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
}
return 0;
}
新知識點:MEMSET函數,
int a[100]; memset(a, MAX,sizeof(a));就是將a數組全部賦值爲MAX,現在才知道他的填充是以字節爲單位,一般用於對字符型變量的初值進行賦值.;
memset() 函數常用於內存空間初始化;
將s所指向的某一塊內存中的每個字節的內容全部設置爲ch指定的ASCII值
塊的大小由第三個參數指定,這個函數通常爲新申請的內存做初始化工作,其返回值爲指向S的指針。
void *memset(void *s,int c,size_t n)
總的作用:將已開闢內存空間 s 的首 n 個字節的值設爲值 c。
memset() 函數用來將指定內存的前n個字節設置爲特定的值,其原型爲:
void * memset( void * ptr, int value, size_t num );
參數說明:
- ptr 爲要操作的內存的指針。
- value 爲要設置的值。你既可以向 value 傳遞 int 類型的值,也可以傳遞 char 類型的值,int 和 char 可以根據 ASCII 碼相互轉換。
- num 爲 ptr 的前 num 個字節,size_t 就是unsigned int。
【函數說明】memset() 會將 ptr 所指的內存區域的前 num 個字節的值都設置爲 value,然後返回指向 ptr 的指針。
memset() 可以將一段內存空間全部設置爲特定的值,所以經常用來初始化字符數組。例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
// 不可以聲明爲 char *str = "http://c.biancheng.net";
char str[] = "http://c.biancheng.net";
memset(str, '-', 7);
puts(str);
system("pause");
return EXIT_SUCCESS;
}