数组与字符串 1.1

实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?

分析:依次遍历输入字符串的每个字符,若当前字符已经出现过,则返回false;否则,继续处理下一个字符。可以使用位操作来降低空间要求,假设输入字符为ASCII字符。

 1 #include <iostream>
 2 #include <fstream>
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7 bool isUnique( const char *s );
 8 
 9 int main( int argc, char *argv[] ) {
10     string data_file = "./1.1.txt";
11     ifstream ifile( data_file.c_str(), ios::in );
12     if( !ifile.is_open() ) {
13         fprintf( stderr, "cannot open file: %s\n", data_file.c_str() );
14         return -1;
15     }
16     string str;
17     while( ifile >>str ) {
18         cout <<str <<": ";
19         cout <<boolalpha <<isUnique( str.c_str() ) <<endl;
20     }
21     ifile.close();
22     return 0;
23 }
24 
25 bool isUnique( const char *s ) {
26     // bool table[256] = { false };
27     unsigned char table[32] = { 0 };
28     while( *s != '\0' ) {
29         if( table[*s/8] & 1<<*s%8 ) { return false; }
30         table[*s/8] |= 1<<*(s++)%8;
31     }
32     return true;
33 }

测试文件

a
aa
ab
abc
abcd
aaaaaaaaaaaaaaaaaaa

 

转载于:https://www.cnblogs.com/moderate-fish/p/3967095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值