在有序但含有空的数组中查找字符串

来源:互联网 发布:联通网络电视客户端 编辑:程序博客网 时间:2024/05/21 07:02

比如给定一个字符串数组,“”,“ab”,"ab","","","","xx","yy","zz",查找ab字符串最左边的位置就是1,而不是2。

如果要找的字符串是空,或者根本没有找到,就返回-1

思路采用二分法,但是这里和普通二分不同,要进行判断

设要找的字符串为str,start=0,end等于字符串数组最后一个位置

如果当前mid处值等于要找的,这时候传给全局变量Pos,但是这个pos并非最终结果,因为很有可能他的左边,还有要找的字符串,所以要把end设为mid-1.

如果当前mid处值不等于要找的,这里有两个情况

一个是等于空串,这时候要从空串处从右到左遍历,如果遍历到最终,还是没有找到非空,肯定是返回-1了

如果找到了非空串,还要分三种情况判断

    一种是等于要找的字符串,这时候就把位置付给全局变量pos

     一种是小于要找的字符串,证明要找的字符串一定在右半区间,左半区间已经不用找了,start赋值为mid+1

    一种是大于要找的字符串,这时候证明要找的肯定在其左边,end赋值为其下标-1。

一种是不等于空串,这样就按照普通二分来处理,大于要找的,就在左半区间找,小于要找的,就在右半区间找。

#include<iostream>#include<string>using namespace std;int getPosition(string* s,string aim,int n){    //int n=s.size();//这里不能求s的长度    if(n==0) return -1;    int left=0;    int right=n-1;    int res=0;    int mid=0;    while(left<=right)    {        mid=left+(right-left)/2;        if(aim==s[mid])        {            res=mid;            right=mid-1;        }        else if(s[mid]=="")//注意空字符串的表示方法        {            int temp=mid;//这里不能是mid-1            while(temp>=left&&s[temp]=="")                temp--;            if(temp<left||s[temp]<aim) left=mid+1;            else            {                res=s[temp]==aim?temp:res;                right=temp-1;            }        }        else        {            if(s[mid]>aim) right=mid-1;            else left=mid+1;        }    }      return res;}int main(){    string s[]={"aa","cd","cd","de","de","","","eg"};    cout<<getPosition(s,"cd",sizeof(s)/sizeof(s[0]))<<endl;//注意传入参数如何求数组的长度    system("pause");    return 0;}


阅读全文
0 0