diff --git a/images/starcharts.svg b/images/starcharts.svg
index c4349b3b50acd..7de08ce5bfc6e 100644
--- a/images/starcharts.svg
+++ b/images/starcharts.svg
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
+L 919 43
+L 919 43
+L 919 43
+L 919 43
+L 919 43
+L 919 43
+L 919 43
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 42
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 41
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 40
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 39
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 919 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 38
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 37
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 920 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 36
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 921 35
+L 922 35
+L 922 35
+L 922 35
+L 922 35
+L 922 35
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 34
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 922 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 33
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 923 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 32
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 924 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 31
+L 925 30
+L 925 30
+L 925 30
+L 925 30
+L 925 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 926 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 30
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 927 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 29
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 928 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 28
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 929 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 930 27
+L 931 27
+L 931 27
+L 931 27
+L 931 27
+L 931 27
+L 931 27
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 931 26
+L 932 26
+L 932 26
+L 932 26
+L 932 26
+L 932 26
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 25
+L 932 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 933 24
+L 934 24
+L 934 24
+L 934 24
+L 934 24
+L 934 24
+L 934 24
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 934 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 23
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 935 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 936 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 22
+L 937 21
+L 937 21
+L 937 21
+L 937 21
+L 937 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 938 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 939 21
+L 940 21
+L 940 21
+L 940 21
+L 940 21
+L 940 21
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 940 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 941 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 942 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 20
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 943 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 944 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 945 19
+L 946 19
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 946 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 947 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 18
+L 948 17
+L 948 17
+L 948 17
+L 948 17
+L 948 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 949 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17
+L 950 17" style="stroke-width:2;stroke:rgba(129,199,239,1.0);fill:none"/>
\ No newline at end of file
diff --git a/solution/0300-0399/0383.Ransom Note/README.md b/solution/0300-0399/0383.Ransom Note/README.md
index e9ca1a0ff63b3..8ae87e69c7f8e 100644
--- a/solution/0300-0399/0383.Ransom Note/README.md
+++ b/solution/0300-0399/0383.Ransom Note/README.md
@@ -48,7 +48,13 @@
-用一个数组或字典 chars 存放 magazine 中每个字母出现的次数。遍历 ransomNote 中每个字母,判断 chars 是否包含即可。
+**方法一:哈希表或数组**
+
+我们可以用一个哈希表或长度为 $26$ 的数组 $cnt$ 记录字符串 `magazine` 中所有字符出现的次数。然后遍历字符串 `ransomNote`,对于其中的每个字符 $c$,我们将其从 $cnt$ 的次数减 $1$,如果减 $1$ 之后的次数小于 $0$,说明 $c$ 在 `magazine` 中出现的次数不够,因此无法构成 `ransomNote`,返回 $false$ 即可。
+
+否则,遍历结束后,说明 `ransomNote` 中的每个字符都可以在 `magazine` 中找到对应的字符,因此返回 $true$。
+
+时间复杂度 $O(m + n)$,空间复杂度 $O(C)$。其中 $m$ 和 $n$ 分别为字符串 `ransomNote` 和 `magazine` 的长度;而 $C$ 为字符集的大小,本题中 $C = 26$。
@@ -59,11 +65,11 @@
```python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
- counter = Counter(magazine)
+ cnt = Counter(magazine)
for c in ransomNote:
- if counter[c] <= 0:
+ cnt[c] -= 1
+ if cnt[c] < 0:
return False
- counter[c] -= 1
return True
```
@@ -74,50 +80,34 @@ class Solution:
```java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
- int[] counter = new int[26];
- for (char c : magazine.toCharArray()) {
- ++counter[c - 'a'];
+ int[] cnt = new int[26];
+ for (int i = 0; i < magazine.length(); ++i) {
+ ++cnt[magazine.charAt(i) - 'a'];
}
- for (char c : ransomNote.toCharArray()) {
- if (counter[c - 'a'] <= 0) {
+ for (int i = 0; i < ransomNote.length(); ++i) {
+ if (--cnt[ransomNote.charAt(i) - 'a'] < 0) {
return false;
}
- --counter[c - 'a'];
}
return true;
}
}
```
-### **TypeScript**
-
-```ts
-function canConstruct(ransomNote: string, magazine: string): boolean {
- let counter = new Array(26).fill(0);
- let base = 'a'.charCodeAt(0);
- for (let s of magazine) {
- ++counter[s.charCodeAt(0) - base];
- }
- for (let s of ransomNote) {
- let idx = s.charCodeAt(0) - base;
- if (counter[idx] == 0) return false;
- --counter[idx];
- }
- return true;
-}
-```
-
### **C++**
```cpp
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
- vector counter(26);
- for (char c : magazine) ++counter[c - 'a'];
- for (char c : ransomNote) {
- if (counter[c - 'a'] <= 0) return false;
- --counter[c - 'a'];
+ int cnt[26]{};
+ for (char& c : magazine) {
+ ++cnt[c - 'a'];
+ }
+ for (char& c : ransomNote) {
+ if (--cnt[c - 'a'] < 0) {
+ return false;
+ }
}
return true;
}
@@ -128,18 +118,13 @@ public:
```go
func canConstruct(ransomNote string, magazine string) bool {
- rc := make([]int, 26)
- for _, b := range ransomNote {
- rc[b-'a']++
- }
-
- mc := make([]int, 26)
- for _, b := range magazine {
- mc[b-'a']++
+ cnt := [26]int{}
+ for _, c := range magazine {
+ cnt[c-'a']++
}
-
- for i := 0; i < 26; i++ {
- if rc[i] > mc[i] {
+ for _, c := range ransomNote {
+ cnt[c-'a']--
+ if cnt[c-'a'] < 0 {
return false
}
}
@@ -147,6 +132,46 @@ func canConstruct(ransomNote string, magazine string) bool {
}
```
+### **TypeScript**
+
+```ts
+function canConstruct(ransomNote: string, magazine: string): boolean {
+ const cnt = new Array(26).fill(0);
+ for (const c of magazine) {
+ ++cnt[c.charCodeAt(0) - 97];
+ }
+ for (const c of ransomNote) {
+ if (--cnt[c.charCodeAt(0) - 97] < 0) {
+ return false;
+ }
+ }
+ return true;
+}
+```
+
+### **PHP**
+
+```php
+class Solution {
+ /**
+ * @param String $ransomNote
+ * @param String $magazine
+ * @return Boolean
+ */
+ function canConstruct($ransomNote, $magazine) {
+ $arrM = str_split($magazine);
+ for ($i = 0; $i < strlen($magazine); $i++) {
+ $hashtable[$arrM[$i]] += 1;
+ }
+ for ($j = 0; $j < strlen($ransomNote); $j++) {
+ if (!isset($hashtable[$ransomNote[$j]]) || $hashtable[$ransomNote[$j]] == 0) return false;
+ else $hashtable[$ransomNote[$j]] -= 1;
+ }
+ return true;
+ }
+}
+```
+
### **...**
```
diff --git a/solution/0300-0399/0383.Ransom Note/README_EN.md b/solution/0300-0399/0383.Ransom Note/README_EN.md
index 3c22fee9c46da..e582158c5b902 100644
--- a/solution/0300-0399/0383.Ransom Note/README_EN.md
+++ b/solution/0300-0399/0383.Ransom Note/README_EN.md
@@ -36,11 +36,11 @@
```python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
- counter = Counter(magazine)
+ cnt = Counter(magazine)
for c in ransomNote:
- if counter[c] <= 0:
+ cnt[c] -= 1
+ if cnt[c] < 0:
return False
- counter[c] -= 1
return True
```
@@ -49,50 +49,34 @@ class Solution:
```java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
- int[] counter = new int[26];
- for (char c : magazine.toCharArray()) {
- ++counter[c - 'a'];
+ int[] cnt = new int[26];
+ for (int i = 0; i < magazine.length(); ++i) {
+ ++cnt[magazine.charAt(i) - 'a'];
}
- for (char c : ransomNote.toCharArray()) {
- if (counter[c - 'a'] <= 0) {
+ for (int i = 0; i < ransomNote.length(); ++i) {
+ if (--cnt[ransomNote.charAt(i) - 'a'] < 0) {
return false;
}
- --counter[c - 'a'];
}
return true;
}
}
```
-### **TypeScript**
-
-```ts
-function canConstruct(ransomNote: string, magazine: string): boolean {
- let counter = new Array(26).fill(0);
- let base = 'a'.charCodeAt(0);
- for (let s of magazine) {
- ++counter[s.charCodeAt(0) - base];
- }
- for (let s of ransomNote) {
- let idx = s.charCodeAt(0) - base;
- if (counter[idx] == 0) return false;
- --counter[idx];
- }
- return true;
-}
-```
-
### **C++**
```cpp
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
- vector counter(26);
- for (char c : magazine) ++counter[c - 'a'];
- for (char c : ransomNote) {
- if (counter[c - 'a'] <= 0) return false;
- --counter[c - 'a'];
+ int cnt[26]{};
+ for (char& c : magazine) {
+ ++cnt[c - 'a'];
+ }
+ for (char& c : ransomNote) {
+ if (--cnt[c - 'a'] < 0) {
+ return false;
+ }
}
return true;
}
@@ -103,18 +87,13 @@ public:
```go
func canConstruct(ransomNote string, magazine string) bool {
- rc := make([]int, 26)
- for _, b := range ransomNote {
- rc[b-'a']++
+ cnt := [26]int{}
+ for _, c := range magazine {
+ cnt[c-'a']++
}
-
- mc := make([]int, 26)
- for _, b := range magazine {
- mc[b-'a']++
- }
-
- for i := 0; i < 26; i++ {
- if rc[i] > mc[i] {
+ for _, c := range ransomNote {
+ cnt[c-'a']--
+ if cnt[c-'a'] < 0 {
return false
}
}
@@ -122,6 +101,46 @@ func canConstruct(ransomNote string, magazine string) bool {
}
```
+### **TypeScript**
+
+```ts
+function canConstruct(ransomNote: string, magazine: string): boolean {
+ const cnt = new Array(26).fill(0);
+ for (const c of magazine) {
+ ++cnt[c.charCodeAt(0) - 97];
+ }
+ for (const c of ransomNote) {
+ if (--cnt[c.charCodeAt(0) - 97] < 0) {
+ return false;
+ }
+ }
+ return true;
+}
+```
+
+### **PHP**
+
+```php
+class Solution {
+ /**
+ * @param String $ransomNote
+ * @param String $magazine
+ * @return Boolean
+ */
+ function canConstruct($ransomNote, $magazine) {
+ $arrM = str_split($magazine);
+ for ($i = 0; $i < strlen($magazine); $i++) {
+ $hashtable[$arrM[$i]] += 1;
+ }
+ for ($j = 0; $j < strlen($ransomNote); $j++) {
+ if (!isset($hashtable[$ransomNote[$j]]) || $hashtable[$ransomNote[$j]] == 0) return false;
+ else $hashtable[$ransomNote[$j]] -= 1;
+ }
+ return true;
+ }
+}
+```
+
### **...**
```
diff --git a/solution/0300-0399/0383.Ransom Note/Solution.cpp b/solution/0300-0399/0383.Ransom Note/Solution.cpp
index fb75586030ee1..1fe31e26b1b36 100644
--- a/solution/0300-0399/0383.Ransom Note/Solution.cpp
+++ b/solution/0300-0399/0383.Ransom Note/Solution.cpp
@@ -1,11 +1,14 @@
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
- vector counter(26);
- for (char c : magazine) ++counter[c - 'a'];
- for (char c : ransomNote) {
- if (counter[c - 'a'] <= 0) return false;
- --counter[c - 'a'];
+ int cnt[26]{};
+ for (char& c : magazine) {
+ ++cnt[c - 'a'];
+ }
+ for (char& c : ransomNote) {
+ if (--cnt[c - 'a'] < 0) {
+ return false;
+ }
}
return true;
}
diff --git a/solution/0300-0399/0383.Ransom Note/Solution.go b/solution/0300-0399/0383.Ransom Note/Solution.go
index 2ca7338c82e6d..5480bad918f69 100644
--- a/solution/0300-0399/0383.Ransom Note/Solution.go
+++ b/solution/0300-0399/0383.Ransom Note/Solution.go
@@ -1,18 +1,13 @@
func canConstruct(ransomNote string, magazine string) bool {
- rc := make([]int, 26)
- for _, b := range ransomNote {
- rc[b-'a']++
+ cnt := [26]int{}
+ for _, c := range magazine {
+ cnt[c-'a']++
}
-
- mc := make([]int, 26)
- for _, b := range magazine {
- mc[b-'a']++
- }
-
- for i := 0; i < 26; i++ {
- if rc[i] > mc[i] {
+ for _, c := range ransomNote {
+ cnt[c-'a']--
+ if cnt[c-'a'] < 0 {
return false
}
}
return true
-}
+}
\ No newline at end of file
diff --git a/solution/0300-0399/0383.Ransom Note/Solution.java b/solution/0300-0399/0383.Ransom Note/Solution.java
index 49634a66278cc..77e24ef05b333 100644
--- a/solution/0300-0399/0383.Ransom Note/Solution.java
+++ b/solution/0300-0399/0383.Ransom Note/Solution.java
@@ -1,14 +1,13 @@
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
- int[] counter = new int[26];
- for (char c : magazine.toCharArray()) {
- ++counter[c - 'a'];
+ int[] cnt = new int[26];
+ for (int i = 0; i < magazine.length(); ++i) {
+ ++cnt[magazine.charAt(i) - 'a'];
}
- for (char c : ransomNote.toCharArray()) {
- if (counter[c - 'a'] <= 0) {
+ for (int i = 0; i < ransomNote.length(); ++i) {
+ if (--cnt[ransomNote.charAt(i) - 'a'] < 0) {
return false;
}
- --counter[c - 'a'];
}
return true;
}
diff --git a/solution/0300-0399/0383.Ransom Note/Solution.php b/solution/0300-0399/0383.Ransom Note/Solution.php
new file mode 100644
index 0000000000000..cca007e615ca9
--- /dev/null
+++ b/solution/0300-0399/0383.Ransom Note/Solution.php
@@ -0,0 +1,18 @@
+class Solution {
+ /**
+ * @param String $ransomNote
+ * @param String $magazine
+ * @return Boolean
+ */
+ function canConstruct($ransomNote, $magazine) {
+ $arrM = str_split($magazine);
+ for ($i = 0; $i < strlen($magazine); $i++) {
+ $hashtable[$arrM[$i]] += 1;
+ }
+ for ($j = 0; $j < strlen($ransomNote); $j++) {
+ if (!isset($hashtable[$ransomNote[$j]]) || $hashtable[$ransomNote[$j]] == 0) return false;
+ else $hashtable[$ransomNote[$j]] -= 1;
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/solution/0300-0399/0383.Ransom Note/Solution.py b/solution/0300-0399/0383.Ransom Note/Solution.py
index c8b39da8dc9e1..108d6a5e80a08 100644
--- a/solution/0300-0399/0383.Ransom Note/Solution.py
+++ b/solution/0300-0399/0383.Ransom Note/Solution.py
@@ -1,8 +1,8 @@
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
- counter = Counter(magazine)
+ cnt = Counter(magazine)
for c in ransomNote:
- if counter[c] <= 0:
+ cnt[c] -= 1
+ if cnt[c] < 0:
return False
- counter[c] -= 1
return True
diff --git a/solution/0300-0399/0383.Ransom Note/Solution.ts b/solution/0300-0399/0383.Ransom Note/Solution.ts
index 6115b6b15dd71..66a65595b63e0 100644
--- a/solution/0300-0399/0383.Ransom Note/Solution.ts
+++ b/solution/0300-0399/0383.Ransom Note/Solution.ts
@@ -1,13 +1,12 @@
function canConstruct(ransomNote: string, magazine: string): boolean {
- let counter = new Array(26).fill(0);
- let base = 'a'.charCodeAt(0);
- for (let s of magazine) {
- ++counter[s.charCodeAt(0) - base];
+ const cnt = new Array(26).fill(0);
+ for (const c of magazine) {
+ ++cnt[c.charCodeAt(0) - 97];
}
- for (let s of ransomNote) {
- let idx = s.charCodeAt(0) - base;
- if (counter[idx] == 0) return false;
- --counter[idx];
+ for (const c of ransomNote) {
+ if (--cnt[c.charCodeAt(0) - 97] < 0) {
+ return false;
+ }
}
return true;
}
diff --git a/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README.md b/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README.md
index 974a4414f3a81..c7c36973527a1 100644
--- a/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README.md
+++ b/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README.md
@@ -201,6 +201,29 @@ impl Solution {
}
```
+### **PHP**
+
+```php
+class Solution {
+ /**
+ * @param String[] $letters
+ * @param String $target
+ * @return String
+ */
+ function nextGreatestLetter($letters, $target) {
+ $left = 0;
+ $right = count($letters);
+ while ($left <= $right) {
+ $mid = floor($left + ($right - $left) / 2);
+ if ($letters[$mid] > $target) $right = $mid - 1;
+ else $left = $mid + 1;
+ }
+ if ($left >= count($letters)) return $letters[0];
+ else return $letters[$left];
+ }
+}
+```
+
### **...**
```
diff --git a/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README_EN.md b/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README_EN.md
index 5e48e0f5e6a7a..8255a3cbbf53c 100644
--- a/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README_EN.md
+++ b/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README_EN.md
@@ -167,6 +167,29 @@ impl Solution {
}
```
+### **PHP**
+
+```php
+class Solution {
+ /**
+ * @param String[] $letters
+ * @param String $target
+ * @return String
+ */
+ function nextGreatestLetter($letters, $target) {
+ $left = 0;
+ $right = count($letters);
+ while ($left <= $right) {
+ $mid = floor($left + ($right - $left) / 2);
+ if ($letters[$mid] > $target) $right = $mid - 1;
+ else $left = $mid + 1;
+ }
+ if ($left >= count($letters)) return $letters[0];
+ else return $letters[$left];
+ }
+}
+```
+
### **...**
```
diff --git a/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/Solution.php b/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/Solution.php
new file mode 100644
index 0000000000000..88134ca3f7158
--- /dev/null
+++ b/solution/0700-0799/0744.Find Smallest Letter Greater Than Target/Solution.php
@@ -0,0 +1,18 @@
+class Solution {
+ /**
+ * @param String[] $letters
+ * @param String $target
+ * @return String
+ */
+ function nextGreatestLetter($letters, $target) {
+ $left = 0;
+ $right = count($letters);
+ while ($left <= $right) {
+ $mid = floor($left + ($right - $left) / 2);
+ if ($letters[$mid] > $target) $right = $mid - 1;
+ else $left = $mid + 1;
+ }
+ if ($left >= count($letters)) return $letters[0];
+ else return $letters[$left];
+ }
+}
\ No newline at end of file