/*
ä¸ä¸²é¦å°¾ç¸è¿çç å(m 个)ï¼æ N ç§é¢è²(N<=10)ï¼
设计ä¸ä¸ªç®æ³ï¼ååºå
¶ä¸ä¸æ®µï¼è¦æ±å
å«ææ N ä¸é¢è²ï¼å¹¶ä½¿é¿åº¦æçã
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int shortestlengh(char * in, char ** dst, int N)
{
//åæininçå½¢å¼ï¼é¿å
æ±ä½
int nlen = strlen(in);
char * in2 = (char *)malloc(2 * nlen * sizeof(char));
memcpy(in2, in, nlen * sizeof(char));
memcpy(in2 + nlen, in, nlen * sizeof(char));
int start = 0, end = nlen - 1;
int shortestlen = nlen;
int hash[256] = {0};
int colornum = 0;
int s = 0, e = -1;
//éåææå¯è½çèµ·å§ç¹
while(s < nlen)
{
while(colornum < N && e <= 2 * nlen) //æ¾å°å¨å½åèµ·ç¹ä¸æ¾å°ææé¢è²çç»å°¾
{
e++;
if(hash[int(in2[e])] == 0)
{
colornum++;
}
hash[int(in2[e])]++;
}
//å»æåé¢ç¸åçé¨å
while(in2[s] == in2[s + 1])
{
s++;
hash[(int)in2[s]]--;
}
//æ´æ°æçç串
if(shortestlen > e - s + 1)
{
shortestlen = e - s + 1;
start = s;
end = e;
}
//æ´æ°s,ä»ä¸ä¸ä¸ªé¢è²å¼å§
hash[(int)in2[s]]--;
if(hash[(int)in2[s]] == 0)
{
colornum--;
}
s = s + 1;
}
*(dst) = (char *)malloc(end - start + 2);
memcpy(*dst, in2 + start, end - start + 1);
(*dst)[end - start + 1] = '\0'; //注æ
free(in2);
return end - start + 1;
}
int main()
{
char * s = "addcddcbccbba";
char * d = NULL;
int n = shortestlengh(s, &d, 4);
printf("%d\n%s\n", n, d);
return 0;
}
追é®è¿ä¸ªä¸å¯¹å§ãç½ä¸ç代ç char * s = "addcddcbfgccbba"; è¾åºçä¸å«fgåã
追ç#include<iostream>
#include<string.h>
using namespace std;
//m string a:0,1,...,m-1
//N colors:0,1,...,N-1
//
#define m 10
#define N 3
int findmin(int a[m], int colors[N], int& begin, int& end)
{
begin = 0;
end = -1;
int i = 0;
int j = 0;
int cn = 0;
int minlen = m;
colors[a[0]] ++;
cn++;
while (i < m)
{
//memset(colors, 0, N*sizeof(int));
//j = i;
bool bl = false;
while (j == 0 || j != i)
{
if (bl)
{
if (colors[a[j]] == 0)
cn++;
colors[a[j]] ++;
}
bl = true;
if (cn == N)
{
int len = j - i + 1;
if (len < 0)
len += m;
if (len < minlen)
{
begin = i;
end = j;
minlen = j - i + 1;
}
break;
}
j = (j + 1) % m;
}
if (i == j && minlen == m)
break;
colors[a[i]] = colors[a[i]] - 1;
if (colors[a[i]] == 0)
cn--;
i++;
}
return minlen;
}
int main()
{
int a[m] = { 2,1,0,1,1,2,1,0,1,1 };
int c[N] = { 0,0,0 };
int begin = 0, end = 0;
int minlen = findmin(a, c, begin, end);
int i = 0;
cout << "string: ";
while (i < m)
{
cout << a[i] << ",";
i++;
}
cout << " minlen: " << minlen << endl;
cout << begin << "," << end << endl;
}
追é®int a[m] = { 2,1,0,1,1,9,1,0,1,1 }; æ¢æè¿ä¸ªæä¹è¾åº1ï¼0 ï¼