<?php /* This function returns the position of string s1 within string s2. The position is 1 based. If s1 is not in s2, 0 is returned. */ function InStr($s1, $s2) { //Check for valid input if(!(is_string($s1) && is_string($s2))) return 0; $s1len = strlen($s1); $s2len = strlen($s2); //Check if s1 in s2 at all if(!ereg($s1, $s2)) return 0; //Resolve simple case if($s1 == $s2) return 1; //Set initial search limits $begin = 0; $end = $s2len - $s1len; //Initialize position $position = 0; //Do binary search of s2 for s1 //Check left side first to find first occurance of s1 //Check right side first to find last occurance of s1 while($end > $begin + 1) { $middle = ceil(($begin + $end) / 2); $leftBegin = $begin; $rightBegin = $middle + $s1len; $leftEnd = $middle; $rightEnd = $end + $s1len; //Check left first if(ereg($s1, substr($s2, $leftBegin, $rightBegin - $leftBegin))) { $end = $middle; } else //(ereg($s1, substr($s2, $leftEnd, $rightEnd - $leftEnd))) { $position += $middle - $begin; $begin = $middle; } } //Resolve 1 off problems introduced by ceil if(ereg($s1, substr($s2, $end, $s1len))) $position++; //Return position 1 based return $position + 1; } ?>
Related Post:
Code C/C++: Thuật toán sắp xếp vun đống (Heap Sort)Ý tưởng thuật toán:Ta xem danh sách n phần tử a0, a1, …,an-1 là cây nhị phân. Cây nhị phân này được xác định như sau: tại nút thứ i tương ứng với chỉ số thứ i của mảng có con trái là nút 2*(i+1)-1 và con phải 2*(i+1) nếu 2*(i+1)-1 và 2*(i+1) nhỏ hơn n.Thuật toán được mô tả như sau:- Xây dựng Heap sao cho với mọi nút cha đều có g…Read More
Code C/C++: Thuật toán sắp xếp trộn (Merge Sort)Mô tả bài toán: cho 2 danh sách A và B lần lượt có m và n phần tử đã sắp xếp theo thứ tự. Bài toán đặt ra trộn 2 danh sách A và B với nhau thành danh sách C cũng là một danh sách có thứ tự.Thuật toán:Bước 1 :khởi tạo ba chỉ số chạy trong vòng lặp i = 0, j = 0, k = 0 tương ứng cho ba mảng A, B và C.Bước 2: tại mỗi bước nếu cả hai chỉ số (i<m và…Read More
Code C/C++: Thuật toán sắp xếp nhanh (QuickSort)Ý tưởng thuật toán: xét dãy n phần tử a0, a1, …,an-1Bước 1: Chọn khóa pivot = a(left+right)/2Bước 2: Phân vùng. Những phần tử nhỏ hơn khóa thì nằm bên trái của khóa, những phần tử lớn hơn khóa thì nằm bên phải của khóa và những phần tử bằng khóa có thể nằm bất cứ chỗ nào trên dãy.Bước 3: Sắp xếp cho cả hai phân vùng mới bên trái và bên ph…Read More
Code C/C++: Thuật toán sắp xếp chèn (Insertion Sort)Ý tưởng thuật toán: xét dãy n phần tử a0, a1, …,an-1- Xem dãy gồm 1 phần tử là a0 dãy có thứ tự.- Thêm a1 vào dãy có thứ tự a0 sao cho dãy mới a0, a1 là dãy có thứ tự. Nếu a1 < a0 ta hoán vị a1 với a0.- Thêm a2 vào dãy có thứ tự a0, a1 sao cho dãy mới a0,…Read More
Code C/C++: Thuật toán sắp xếp nổi bọt (Bubble Sort Algorithm)Ý tưởng thuật toán: xuất phát từ phần tử cuối danh sách ta tiến hành so sánh với phần tử bên trái của nó. Nếu phần tử đang xét có khóa nhỏ hơn phần tử bên trái của nó ta tiến đưa nó về bên trái của dãy bằng cách hoán vị với phần tử bên trái của nó. Tiếp tục thực hiện như thế đối với bài toán có n phần tử thì sau n –1 bước ta thu được danh sách tăng dần. Ví dụ: …Read More
Code C/C++: Thuật toán sắp xếp lựa chọn (Selection Sort)Ý tưởng thuật toán: xét dãy n phần tử a0, a1, …,an-1- Chọn trong dãy a0, a1, …,an-1 ra phần tử có khóa nhỏ nhất và hoán vị nó với a0.- Chọn trong dãy a1, a2, …,an-1 ra phần tử có khóa nhỏ nhất và hoán vị nó với a1.- Cứ tiếp tục như thế sau n –1 bước ta thu được danh sách có thứ tự.Ví dụ:Sau 9 bước lặp ta thu được dãy đã được sắp…Read More
Klik untuk melihat kode: