Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481981
  • 博文数量: 148
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1553
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-23 23:09
文章分类

全部博文(148)

文章存档

2010年(6)

2009年(58)

2008年(84)

我的朋友

分类:

2009-09-16 12:36:20

题目要求:
abcdefb就输出abcdef
abcbef就输出cbef

就说可以用hash实现,复杂度是O(n)
请给我点思路,我要的不是代码,谢谢
-----------------------------
思路:
直观地得到一个思路,表达起来真够难的,直接写代码要更容易

以abcbef这个串为例
用一个数据结构pos记录每个元素曾出现的下标,初始为-1
从s[0]开始,pos['a'] == -1,说明a还未出现过,令pos['a'] = 0,视为将a"加入当前串",同时长度++
同理令pos['b'] = 1,pos['c'] = 2
到s[3]时,pos['b'] != -1,说明'b'在前面已经出现过了,此时可得到一个不重复串"abc",刷新当前的最大长度,然后做如下处理:
pos[s[0~2]] = -1,亦即将"ab""移出当前串",同时当前长度减去3

重复以上过程
-------------------------------
一个初步的算法实现:
#include
using namespace std; 

int main()

{
char *str="abcbef";
 
 
  int nLengths(0), nTmpLength(0), i(0);
  int a[256];
  int span;  //第一次重复的时候,与最早出现的字符像隔得字符个数
  for ( i; i < 256; ++i )
  {
  a[i] = 0;
  }
 
 
  for ( i = 0; i < 6; ++i  )
  {
  int k = (int)(szAry[i]);
  if ( a[k] == 0 )
  {
  nTmpLength += 1;
  a[k] = nTmpLength;
 
  if ( nTmpLength > nLengths )
  {
  nLengths = nTmpLength;
  }
 
  }
  else
  {
   span=i-(a[k]-1);
  a[k] = nTmpLength;
  nTmpLength = span;
  }
  }
 
 
  printf( "nLengths: %d\n", nLengths );
 
  return 1;

}

后续问题:
这道题没有解决,但大体的思路有了,只对hash的应用,没有输出最大不重复字符串的部分。待续

转自:
阅读(1199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~