码迷,mamicode.com
首页 > 其他好文 > 详细

第一个只出现一次的字符位置

时间:2019-03-13 12:22:22      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:www   区分大小写   需要   字符串   vector   map   相加   min   solution   

第一个只出现一次的字符位置

题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

使用哈希表来进行存储, 由于不能使用哈希表进行遍历, 所以还是用源字符串进行遍历

刚开始不理解为什么时间复杂度是O(n), 现在明白了, 第一个for是O(n), 第二个for也是O(n), 两个大O相加后时间复杂度是O(n), 下面是两个大O相乘

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        const int tableSize = 256;
        vector<int> vt;
        vt.resize(tableSize);
        for (int i = 0; i < str.length(); i++) {
            vt[str[i]]++;
        }
        for (int i = 0; i < str.length(); i++) {
            if (1 == vt[str[i]]) {
                return i;
            }
        }
        return -1;
    }
};

使用stl库中的map, map内部使用红黑树, 因此不能使用map进行遍历, 还需要用源字符串进行遍历, 话说是字符串中出现的位置, 好像就要用源字符串进行遍历

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        map<char, int> my_map;
        for (auto i = 0; i < str.length(); i++){
            my_map[str[i]]++;
        }
        for (auto i = 0; i < str.length(); i++) {
            if (1 == my_map[str[i]]) {
                return i;
            }
        }
        return -1;
    }
};

暴力方法, 没什么技术含量

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        int position = 0;
        
        while (position < str.length()) {
            for (int i = 0; i < str.length(); i++) {
                if (i == position)
                    continue;
                if (str[position] == str[i])
                    break;
                if (i == str.length() - 1)
                    return position;
            }
            position++;
        }
        
        return -1;
    }
};

第一个只出现一次的字符位置

标签:www   区分大小写   需要   字符串   vector   map   相加   min   solution   

原文地址:https://www.cnblogs.com/hesper/p/10522148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!